Python实现2D NumPy数组的八连通域计数与矩阵值替换
实现方案
这个需求本质是八连通规则下的连通域尺寸映射,最高效简洁的实现方式是依托NumPy配套的SciPy科学计算工具栈完成,无需手动编写邻接遍历逻辑,几行代码即可完全匹配转换规则。
核心逻辑
- 题目要求的八方向单步通行、仅在1值位置连通的规则,可直接通过连通域标记工具的邻接核参数匹配
- 完成全图连通域标记后,统计每个连通域的总元素数,再将对应尺寸值回填到原数组的1值位置,0值位置保留0即可
可直接运行的代码
import numpy as np from scipy import ndimage # 输入原始数组 start = np.array([ [1,1,0,1], [1,0,0,1], [0,1,0,0] ]) # 定义八方向连通邻接核:3x3全1矩阵,覆盖上下、左右、四个斜向的相邻位置 connect_kernel = np.ones((3, 3)) # 标记每个位置所属的连通域ID labels, _ = ndimage.label(start, structure=connect_kernel) # 统计每个连通域的元素总数(直接数每个标签的出现次数即可) domain_sizes = np.bincount(labels.ravel())[1:] # 回填尺寸值,0标签位置直接赋值0,完全匹配转换规则 finish = np.where(labels > 0, domain_sizes[labels - 1], 0)
方案优势
- 性能优异:连通域标记的底层是C语言实现的优化逻辑,处理大尺寸矩阵时,执行效率远高于纯Python手写的BFS/DFS遍历
- 规则完全匹配:通过3x3全1的邻接核,直接实现八方向连通的判断逻辑,无需手动写邻接坐标计算、边界判断的样板代码
- 代码极简:没有冗余的状态维护、连通性判断的逻辑
结果校验
运行上述代码得到的输出矩阵和题目给出的目标矩阵完全一致:
array([[4, 4, 0, 2], [4, 0, 0, 2], [0, 4, 0, 0]])
内容的提问来源于stack exchange,提问作者Vladimir Eremin
相关产品推荐
相关产品推荐

