Numpy根据位置应用函数元素



i有一个带有形状(m,n(的numpy阵列a。我想创建一个具有形状(M,n,3(的新数组B,其中结果将与以下内容相同:

import numpy as np
def myfunc(A,sx=1.5,sy=3.5):
    M,N=A.shape
    B=np.zeros((M,N,3))
    for i in range(M):
        for j in range(N):
            B[i,j,0]=i*sx
            B[i,j,1]=j*sy
            B[i,j,2]=A[i,j]
    return B
A=np.array([[1,2,3],[9,8,7]])
print(myfunc(A))

给出结果:

[[[0.  0.  1. ]
  [0.  3.5 2. ]
  [0.  7.  3. ]]
 [[1.5 0.  9. ]
  [1.5 3.5 8. ]
  [1.5 7.  7. ]]]

有没有循环的方法?我在思考Numpy是否能够使用数组的索引来应用功能元素。类似:

def myfuncEW(indx,value,out,vars):
    out[0]=indx[0]*vars[0]
    out[1]=indx[1]*vars[1]
    out[2]=value
M,N=A.shape
B=np.zeros((M,N,3))
np.applyfunctionelementwise(myfuncEW,A,B,(sx,sy))

您可以使用mgridmoveaxis

>>> M, N = A.shape
>>> I, J = np.mgrid[:M, :N] * np.array((sx, sy))[:, None, None]
>>> np.moveaxis((I, J, A), 0, -1)
array([[[ 0. ,  0. ,  1. ],
        [ 0. ,  3.5,  2. ],
        [ 0. ,  7. ,  3. ]],
       [[ 1.5,  0. ,  9. ],
        [ 1.5,  3.5,  8. ],
        [ 1.5,  7. ,  7. ]]])
>>> 

您可以使用meshgriddstack,例如:

import numpy as np
def myfunc(A,sx=1.5,sy=3.5):
    M, N = A.shape
    J, I = np.meshgrid(range(N), range(M))
    return np.dstack((I*sx, J*sy, A))
A=np.array([[1,2,3],[9,8,7]])
print(myfunc(A))
# array([[[ 0. ,  0. ,  1. ],
#         [ 0. ,  3.5,  2. ],
#         [ 0. ,  7. ,  3. ]],
#
#        [[ 1.5,  0. ,  9. ],
#         [ 1.5,  3.5,  8. ],
#         [ 1.5,  7. ,  7. ]]])

通过对3D阵列B进行预先调整,与堆叠I,J和A。

相比,您可以节省大约一半的时间。
def myfunc(A, sx=1.5, sy=3.5):
    M, N = A.shape
    B = np.zeros((M, N, 3))
    B[:, :, 0] = np.arange(M)[:, None]*sx
    B[:, :, 1] = np.arange(N)[None, :]*sy
    B[:, :, 2] = A
    return B

最新更新