如何根据位移矩阵“移动”二维NumPy数组的值

时间:2019-01-10 11:22:43

标签: python numpy

DD是大小为(Nx, Ny)的2D数组。 UxUy是两个大小相同的整数二维数组,它们定义了如何在新矩阵DD中移动DD_new的值。

例如,如果Ux[0,0]=2Uy[0,0]=3,则值DD[0,0]将存储在DD_new[2,3]中。如果需要将DD的多个值存储在DD_new的相同位置中,则将它们相加。

我正在寻找一种优化的脚本,以尽快执行此“替换”操作。

我已经有一个简短的脚本,但是如果有人知道如何使用矩阵和数组操作对其进行改进,它将对我有帮助:

XX, YY = np.meshgrid(range(Nx), range(Ny))

XX_new = (XX + Ux).astype(int)
YY_new = (YY + Uy).astype(int)

for ix in range(Nx):
    for iy in range(Ny):
        x_new = XX_new[ix, iy]
        y_new = YY_new[ix, iy]
        if (x_new >= 0) and (x_new < Nx) and (y_new >= 0) and (y_new < Ny):
            DD_new[x_new, y_new] += DD[XX[ix, iy], YY[ix, iy]]

此外,如果有人知道如何使用非整数矩阵UxUy,以及通过在矩阵{{ 1}},它可以帮助我!

1 个答案:

答案 0 :(得分:0)

您可以使用np.add.at来做到这一点:

import numpy as np

DD = [[ 1,  2,  3, 4],
      [ 5,  6,  7, 8],
      [ 9, 10, 11, 12]]
Ux = [[ 0,  1,  2,  0],
      [ 1,  2,  0,  1],
      [ 2,  0,  2,  1]]
Vx = [[ 0,  1,  2,  3],
      [ 0,  1,  2,  3],
      [ 0,  1,  2,  3]]
DDnew = np.zeros_like(DD)
np.add.at(DDnew, (Ux, Vx), DD)
print(DDnew)
# [[ 1 10  7  4]
#  [ 5  2  0 20]
#  [ 9  6 14  0]]