如何用Numpy统计矩阵元素水平垂直相邻数生成同尺寸结果矩阵
实现方案
针对你给出的矩阵和期望输出,提供两种可直接运行的通用实现,适配任意尺寸的numpy矩阵输入:
方法1:邻域位置计数(完全匹配你给出的示例结果)
如果你的需求是统计每个位置相邻的有效位置总数(不超出矩阵边界的邻位),以下代码运行结果和你给出的3x3示例完全一致:
import numpy as np def count_neighbors(arr): rows, cols = arr.shape res = np.zeros_like(arr, dtype=int) for i in range(rows): for j in range(cols): cnt = 0 # 遍历所有邻域偏移 for di in (-1, 0, 1): for dj in (-1, 0, 1): if di == 0 and dj == 0: continue # 跳过自身位置 ni, nj = i + di, j + dj if 0 <= ni < rows and 0 <= nj < cols: cnt += 1 res[i, j] = cnt return res # 测试用例 h_diag = np.array([[1,0,1], [0,0,0], [1,0,1]]) print(count_neighbors(h_diag)) # 输出 # [[3 5 3] # [5 8 5] # [3 5 3]]
注:你描述里提到仅统计垂直、水平方向,但如果仅统计四邻域(不含对角线),3x3矩阵的输出应为
[[2,3,2],[3,4,3],[2,3,2]],和你给出的期望结果不符。上述代码是按你提供的期望输出实现的八邻域统计逻辑,如果确实需要四邻域统计,删除对角线方向的判断即可。
方法2:邻域元素值求和(按原矩阵值累加场景)
如果你实际需要的是对相邻位置的元素值做求和(而非统计位置数量),可以用numpy切片实现,运行效率远高于循环逻辑:
import numpy as np def sum_neighbors(arr, four_neighbor=True): res = np.zeros_like(arr, dtype=arr.dtype) # 累加上下左右四个方向的邻值 res[1:, :] += arr[:-1, :] # 下邻 res[:-1, :] += arr[1:, :] # 上邻 res[:, 1:] += arr[:, :-1] # 右邻 res[:, :-1] += arr[:, 1:] # 左邻 if not four_neighbor: # 需要八邻域求和时追加四个对角线方向 res[1:, 1:] += arr[:-1, :-1] res[1:, :-1] += arr[:-1, 1:] res[:-1, 1:] += arr[1:, :-1] res[:-1, :-1] += arr[1:, 1:] return res # 四邻域求和测试 h_diag = np.array([[1,0,1], [0,0,0], [1,0,1]]) print(sum_neighbors(h_diag, four_neighbor=True)) # 输出 # [[0 2 0] # [2 0 2] # [0 2 0]]
内容的提问来源于stack exchange,提问作者Felton Wang
相关产品推荐
相关产品推荐

