在numpy中返回矩阵邻居总和的最简单方法

Whu*_*hud 3 python numpy matrix scipy python-3.x

我正在尝试制作一个需要矩阵的邻居(不包括自身)和 ex 的程序:

 matrix([[0, 0, 0],
        [1, 0, 1],
        [0, 1, 0]])  
Run Code Online (Sandbox Code Playgroud)

会返回:

matrix([[1, 2, 1],
        [1, 3, 1],
        [2, 2, 2]])
Run Code Online (Sandbox Code Playgroud)

我这里有一个工作代码,但它又大又乱,而且我是 numpy 的新手,所以我需要一些帮助来清理和优化它。(我觉得必须有更好的方法)

示例代码:

import numpy as np

def NiSum(m):
    new = []
    for x in range(m.shape[0]-1):
        row = []
        for y in range(m.shape[1]-1):
            Ni = 0
            for a in [1,1],[1,0],[1,-1],[0,1],[0,-1],[-1,1],[-1,0],[-1,-1]:
                Ni += m[x+a[0],y+a[1]]
            row.append(Ni)
        new.append(row)
    return np.matrix(new)


example = np.matrix('0 0 0 0 0 0 0 0; '*3+'0 0 0 1 1 1 0 0; '*3+'0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 ')

NiSum(example)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助 !

Div*_*kar 5

您正在对该3x3邻域中的所有值求和,但不包括元素本身。因此,我们可以使用Scipy's 2D convolution并从中减去该输入数组/矩阵以获得所需的输出,就像这样 -

from scipy.signal import convolve2d

convolve2d(a,np.ones((3,3),dtype=int),'same') - a
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [11]: a
Out[11]: 
matrix([[0, 0, 0],
        [1, 0, 1],
        [0, 1, 0]])

In [12]: convolve2d(a,np.ones((3,3),dtype=int),'same') - a
Out[12]: 
matrix([[1, 2, 1],
        [1, 3, 1],
        [2, 2, 2]])
Run Code Online (Sandbox Code Playgroud)

或者简单地形成一个内核,除了中心为零以外的所有内核,并使用相同的 2D 卷积 -

In [31]: kernel = np.array([[1,1,1],[1,0,1],[1,1,1]])

In [32]: np.asmatrix(convolve2d(a,kernel,'same'))
Out[32]: 
matrix([[1, 2, 1],
        [1, 3, 1],
        [2, 2, 2]])
Run Code Online (Sandbox Code Playgroud)