如何快速提取二维Numpy数组选定点的邻域并消除循环?
问题2:无循环提取Moore邻域并筛选有效点
要去掉两层循环实现Moore邻域(3×3范围)的筛选,同样可以通过广播+布尔掩码批量处理:
实现代码
import numpy as np test_arr = np.zeros((10, 10), dtype=int) test_arr[[0, 1, 4], [0, 0, 8]] = 1 indices_r, indices_c = np.nonzero(test_arr) test_mask = np.zeros((10, 10), dtype=bool) test_mask[[2, 4], [0, 8]] = 1 N = test_arr.shape[0] # 生成Moore邻域的所有行/列偏移(3×3共9个方向) offsets_r, offsets_c = np.meshgrid(np.arange(-1, 2), np.arange(-1, 2), indexing="ij") offsets_r = offsets_r.ravel() # 转为一维数组:(9,) offsets_c = offsets_c.ravel() # 广播生成所有目标点的邻域坐标,形状为(9, 3)(3是目标点数量) neigh_r = indices_r + offsets_r[:, np.newaxis] neigh_c = indices_c + offsets_c[:, np.newaxis] # 批量筛选有效条件:1. 坐标在数组范围内;2. 对应掩码为True valid_mask = (neigh_r >= 0) & (neigh_r < N) & (neigh_c >= 0) & (neigh_c < N) & test_mask[neigh_r, neigh_c] # 提取所有有效邻域坐标 valid_neigh_r = neigh_r[valid_mask] valid_neigh_c = neigh_c[valid_mask] # 合并为(有效数, 2)的坐标对数组 valid_neighs = np.stack([valid_neigh_r, valid_neigh_c], axis=1)
关键说明
- 用
np.meshgrid一次性生成所有Moore偏移,避免手动枚举 - 布尔掩码批量判断所有条件,完全替代嵌套循环
- 如果需要排除目标点自身(即偏移(0,0)的位置),可以在
valid_mask中追加条件:exclude_self = ~((offsets_r[:, np.newaxis] == 0) & (offsets_c[:, np.newaxis] == 0)) valid_mask = valid_mask & exclude_self
内容的提问来源于stack exchange,提问作者LionCereals
相关产品推荐
相关产品推荐

