我有一个形状为(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))
答案 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)
您可以使用mgrid
和moveaxis
:
>>> 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