Python 返回矩阵和的最简单方法';她在努比的邻居

Python 返回矩阵和的最简单方法';她在努比的邻居,python,python-3.x,numpy,matrix,scipy,Python,Python 3.x,Numpy,Matrix,Scipy,我正在尝试制作一个需要矩阵的邻居(不包括其本身)和的程序,例如: 将返回: matrix([[1, 2, 1], [1, 3, 1], [2, 2, 2]]) 我这里有一个工作代码,但它又大又乱,我是numpy的新手,所以我需要一些帮助来清理和优化它。(我觉得应该有更好的办法) 示例代码: import numpy as np def NiSum(m): new = [] for x in range(m.shape[0]-1):

我正在尝试制作一个需要矩阵的邻居(不包括其本身)和的程序,例如:

将返回:

matrix([[1, 2, 1],
        [1, 3, 1],
        [2, 2, 2]])
我这里有一个工作代码,但它又大又乱,我是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)

谢谢你的帮助

您正在对该
3x3
邻域中的所有值求和,但不包括元素本身。因此,我们可以使用输入数组/矩阵并从中减去它,得到所需的输出,如下所示-

from scipy.signal import convolve2d

convolve2d(a,np.ones((3,3),dtype=int),'same') - a
样本运行-

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]])
或者简单地形成一个内核,内核的中心只有零,并使用相同的二维卷积-

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]])

定义一个函数,用于计算矩阵项的所有邻域之和(如果存在):

def sumNeighbors(M,x,y):
    l = []
    for i in range(max(0,x-1),x+2): # max(0,x-1), such that no negative values in range() 
        for j in range(max(0,y-1),y+2):
            try:
                t = M[i][j]
                l.append(t)
            except IndexError: # if entry doesn't exist
                pass
    return sum(l)-M[x][y] # exclude the entry itself
然后,您可以对矩阵中的每个条目进行迭代,并将其结果传递到新矩阵N中:

import numpy as np

M = [[1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]] 

M = np.asarray(M)
N = np.zeros(M.shape)

for i in range(M.shape[0]):
    for j in range(M.shape[1]):
        N[i][j] = sumNeighbors(M, i, j)

print "Original matrix:\n", M
print "Summed neighbors matrix:\n", N
输出:

Original matrix:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
Summed neighbors matrix:
[[ 11.  19.  13.]
 [ 23.  40.  27.]
 [ 17.  31.  19.]]

感谢您的帮助,但是我在尝试安装scipy时遇到了很多问题。
pip install scipy
不起作用,因为我没有scipy mkl
pip install numpy mkl
不起作用,因为它找不到匹配的版本
pip installhttp://www.lfd.uci.edu/~gohlke/pythonlibs/numpy-1.11.2+mkl-cp35-cp35m-win32.whl
因为404错误,我以前从未安装过一个包,只需执行
pip install name
lost@Whud我相信你可以在Scipy安装上发布一个新问题。我不太熟悉这些安装步骤。我会这样做的。谢谢你的帮助。
Original matrix:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
Summed neighbors matrix:
[[ 11.  19.  13.]
 [ 23.  40.  27.]
 [ 17.  31.  19.]]