如何快速将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
相关产品推荐
相关产品推荐

