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

如何快速将Numpy二维布尔数组中True的相邻单元格设为True?

如何快速将Numpy布尔数组中True值的相邻单元格设为True?

我有一个元素为True/False的Numpy布尔型二维数组,希望将所有True值的相邻单元格设置为True。请问在Python中实现该需求的最优/最快方法是什么?

示例

初始矩阵

1 0 0 0 0 1 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0

操作后矩阵

1 1 1 1 1 1 1
1 1 1 1 1 1 1
0 0 1 1 1 0 0

最优/最快方案:使用scipy.ndimage.binary_dilation

对于这类形态学扩展操作,最快的实现是借助scipy.ndimage模块中的binary_dilation函数——它基于优化的C底层实现,处理大型数组时效率远高于纯Python/Numpy循环。

代码示例

import numpy as np
from scipy.ndimage import binary_dilation

# 构建初始布尔数组
initial_arr = np.array([
    [True, False, False, False, False, True, False],
    [False, False, False, True, False, False, False],
    [False, False, False, False, False, False, False]
])

# 定义邻域结构:3x3全True表示包含上下左右+四个对角线的八邻域
# 若仅需四邻域(上下左右),可改为[[0,1,0],[1,1,1],[0,1,0]]
struct_element = np.ones((3, 3), dtype=bool)

# 执行膨胀操作
result_arr = binary_dilation(initial_arr, structure=struct_element).astype(bool)

# 转为int类型打印,匹配示例格式
print(result_arr.astype(int))

无依赖备选方案:纯Numpy实现

如果不想引入Scipy依赖,也可以用Numpy的数组位移和位运算手动实现,虽然速度稍慢,但无需额外安装包:

import numpy as np

initial_arr = np.array([
    [True, False, False, False, False, True, False],
    [False, False, False, True, False, False, False],
    [False, False, False, False, False, False, False]
])

result_arr = initial_arr.copy()

# 处理四邻域(上下左右)
result_arr[1:] |= initial_arr[:-1]    # 上移覆盖
result_arr[:-1] |= initial_arr[1:]    # 下移覆盖
result_arr[:, 1:] |= initial_arr[:, :-1]  # 左移覆盖
result_arr[:, :-1] |= initial_arr[:, 1:]  # 右移覆盖

# 若需包含对角线,添加以下四行
result_arr[1:, 1:] |= initial_arr[:-1, :-1]  # 左上对角线
result_arr[1:, :-1] |= initial_arr[:-1, 1:]  # 右上对角线
result_arr[:-1, 1:] |= initial_arr[1:, :-1]  # 左下对角线
result_arr[:-1, :-1] |= initial_arr[1:, 1:]  # 右下对角线

print(result_arr.astype(int))

内容的提问来源于stack exchange,提问作者Gopal Chitalia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:45:41