基于另一个数组的多个单元格中的值创建 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
我有一个应用程序,我必须在其中处理 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