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

时间:2016-12-14 22:48:39

标签: python numpy numpy-broadcasting

我有一个应用程序,我必须处理1000个2D数组。处理后的数组的结果基于原始数组中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个单元中的一个不存在。我已经开始使用顶部和最右边的填充零来管理其中一些,但我现在卡住了。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

您正在执行的操作可视为使用特定卷积内核执行卷积。这是使用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