You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速提取二维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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:47:54