基于另一个数组的多个单元格中的值创建 Numpy 数组的最有效方法

Most Efficient Way to Create a Numpy Array Based on Values in Multiple Cells of Another Array

我有一个应用程序,我必须在其中处理 1000 个二维数组。处理后的数组的结果基于原始数组中 Kings Move 邻域的一半。出于速度方面的考虑,我尽量避免循环。因此,这是一个 Numpy 数组示例:

array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  5.,  5.,  5.,  5.,  0.,  0.,  0.],
       [ 0.,  1.,  5.,  5.,  1.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 5.,  5.,  5.,  5.,  1.,  5.,  1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  5.,  1.,  1.,  5.,  5.,  1.,  1.,  0.],
       [ 5.,  1.,  5.,  1.,  1.,  5.,  5.,  5.,  1.,  5.,  0.],
       [ 0.,  5.,  1.,  5.,  1.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  5.,  5.,  5.,  0.,  0.,  0.,  0.]])

在每个元素上,我想要它正上方的单元格、右上对角线元素、紧邻右侧的单元格和下对角线元素的总和。因此,使用 [6][0] 处的元素,我想求和 1 + 1 + 1 + 5.

当然,我还必须处理 4 个单元格之一不存在的边缘情况。我已经开始在顶部和最右边填充零来管理其中的一些,但我现在被卡住了。任何建议将不胜感激!

你所做的可以看作是用特定的卷积核进行卷积。这是使用 scipy convolve2d 函数的解决方案:

import numpy as np
import scipy as sp
import scipy.signal

x = np.random.randint(5,size=(10,10))

kernel = np.array([[0,1,1],[0,0,1],[0,0,1]])
kernel = np.fliplr(np.flipud(kernel))

check = sp.signal.convolve2d(x,kernel,mode='same')

print x
print check