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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:51:19