Numpy根据位置元素应用函数

时间:2018-02-09 16:48:22

标签: python numpy

我有一个形状为(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))

3 个答案:

答案 0 :(得分:0)

您可以使用foreach name $docker_names { set name "TestName" puts $name set command "docker inspect --format='\{\{.Id\}\}' ${name} > /home/temp/id.txt" send -- "$command\n" expect "$" } meshgrid,如下所示:

dstack

答案 1 :(得分:0)

您可以使用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. ]]])
>>> 

答案 2 :(得分:0)

通过预先分配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