Python 高效地移动2D numpy子阵列
我有一个表示灰度图像的numpy数组,例如Python 高效地移动2D numpy子阵列,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有一个表示灰度图像的numpy数组,例如 image = numpy.array([ [.0, .0, .0, .0, .1, .3, .5, .0], [.0, .0, .0, .0, .4, .4, .6, .0], [.0, .0, .0, .0, .3, .3, .7, .0], [.0, .0, .0, .0, .0, .0, .0, .0], [.0, .0, .0, .0, .0, .0, .0, .0], [.0, .0, .0,
image = numpy.array([
[.0, .0, .0, .0, .1, .3, .5, .0],
[.0, .0, .0, .0, .4, .4, .6, .0],
[.0, .0, .0, .0, .3, .3, .7, .0],
[.0, .0, .0, .0, .0, .0, .0, .0],
[.0, .0, .0, .0, .0, .0, .0, .0],
[.0, .0, .0, .0, .0, .0, .0, .0],
])
我想将一个子数组移动到一个新位置,用一些常量(比如0.0)填充留下的值。例如,将3x3子阵列从(1,5)的中心位置移动到(3,3)的中心位置将导致:
numpy.array([
[.0, .0, .0, .0, .0, .0, .0, .0],
[.0, .0, .0, .0, .0, .0, .0, .0],
[.0, .0, .1, .3, .5, .0, .0, .0],
[.0, .0, .4, .4, .6, .0, .0, .0],
[.0, .0, .3, .3, .7, .0, .0, .0],
[.0, .0, .0, .0, .0, .0, .0, .0],
])
有没有一种有效的方法来执行这样的移动?既然您知道要从何处移动和移动到何处的起始索引,我们可以使用
np.zero\u像
和numpy索引:
h = w = 3
sub = image[0:0+w,4:4+h]
out = np.zeros_like(image)
然后分配:
out[2:2+w, 2:2+h] = sub
输出:
array([[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0.1, 0.3, 0.5, 0. , 0. , 0. ],
[0. , 0. , 0.4, 0.4, 0.6, 0. , 0. , 0. ],
[0. , 0. , 0.3, 0.3, 0.7, 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ]])
这里有一种使用自定义函数的方法。“中心”的概念仅定义为奇数长度的整数坐标,例如(3 x 3);我还将我的答案限制在方块上
def mover(A, c_in, c_out, size):
side = int((size - 1) / 2)
arr = A[c_in[0]-side: c_in[0]+side+1, c_in[1]-side: c_in[1]+side+1]
res = np.zeros(shape=A.shape)
res[c_out[0]-side: c_out[0]+side+1, c_out[1]-side: c_out[1]+side+1] = arr
return res
centre_in = (1, 5)
centre_out = (3, 3)
size = 3
res = mover(image, centre_in, centre_out, size)
array([[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0.1, 0.3, 0.5, 0. , 0. , 0. ],
[ 0. , 0. , 0.4, 0.4, 0.6, 0. , 0. , 0. ],
[ 0. , 0. , 0.3, 0.3, 0.7, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ]])
您是否可以发布当前用于移动子阵列的代码,以及显示其效率低下原因的一些基准测试?是否有任何其他非零值需要保留(不移动)?如果不是,则答案中的“复制到空白数组”是最佳选择。