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