如何查找二维NumPy数组中值为1的块区域的中心位置
解决方案
你现有的逻辑是判断以当前坐标为中心的3×3邻域所有值均为1,我们可以通过向量化操作完全替代Python层面的循环,实现效率的大幅提升,下面给出两种实现方案:
方案1:基于scipy卷积实现(代码最简洁)
直接用3×3全1核对原数组做二维卷积,卷积结果等于9的位置就是目标中心:
import numpy as np from scipy.signal import convolve2d kernel = np.ones((3, 3), dtype=np.float32) conv_result = convolve2d(a, kernel, mode='same') a_centers = (conv_result == 9).astype(np.float32)
方案2:纯numpy实现(无额外依赖,要求numpy≥1.20.0)
使用numpy自带的滑动窗口工具计算每个3×3邻域的和,再做判断:
import numpy as np # 边界补1层0,保证滑动窗口计算后输出形状和原数组一致 pad_a = np.pad(a, 1, mode='constant') # 生成所有3×3滑动窗口 windows = np.lib.stride_tricks.sliding_window_view(pad_a, (3, 3)) # 计算每个窗口的和,筛选符合条件的位置 a_centers = (windows.sum(axis=(-1, -2)) == 9).astype(np.float32)
两种方案的计算结果和你现有循环逻辑的输出完全一致,面对大尺寸数组时,性能比双重循环高2~3个数量级。
内容的提问来源于stack exchange,提问作者DΦC__WTF
相关产品推荐
相关产品推荐

