如何遍历4维NumPy数组前两维,获取各3x3块的[1,1]值?
解决NumPy滑动窗口遍历3x3块的问题
错误原因
你的代码报错是因为for i,j in window的遍历逻辑错误。window的维度是(478,533,3,3),外层的478和533是滑动窗口的行、列索引维度,直接遍历window时,每次拿到的是一个3x3的数组,而非(i,j)索引对,自然无法拆成两个变量,因此触发“too many values to unpack”错误。
另外注意:你原代码中的条件block[1,1]-1==1 and block[1,1]-1==1逻辑矛盾——既然block[1,1]已经等于1,减1后是0,不可能等于1,这个条件永远不会成立,需要根据实际需求修改判断逻辑。
方法一:嵌套循环遍历索引(适合小数据量)
如果一定要用循环,需要遍历478和533这两个维度的索引值,代码如下:
window = np.lib.stride_tricks.sliding_window_view(tiff_array, (3,3)) P11 = np.zeros([3,3]) # 遍历滑动窗口的行、列索引 for i in range(window.shape[0]): for j in range(window.shape[1]): block = window[i, j, :, :] if block[1,1] == 1: # 这里替换成你实际需要的条件,示例为判断块的[0,0]和[0,1]位置为1 if block[0,0] == 1 and block[0,1] == 1: P11[0,0] += 1
方法二:向量化操作(推荐,效率更高)
NumPy的核心优势是向量化运算,无需循环即可实现需求,处理大数组时性能提升显著。比如统计符合条件的块数量:
window = np.lib.stride_tricks.sliding_window_view(tiff_array, (3,3)) # 提取所有3x3块的中心值 centers = window[:, :, 1, 1] # 生成布尔掩码:中心为1,同时满足自定义条件(示例为块的[0,0]和[0,1]位置为1) mask = (centers == 1) & (window[:, :, 0, 0] == 1) & (window[:, :, 0, 1] == 1) # 统计符合条件的块数量,赋值给P11[0,0] P11[0,0] = np.sum(mask)
内容的提问来源于stack exchange,提问作者d.nikolai
相关产品推荐
相关产品推荐

