Numpy 将数组索引与数字相乘
for循环中是否有用于以下操作的短numpy命令Numpy 将数组索引与数字相乘,numpy,indexing,numpy-ndarray,Numpy,Indexing,Numpy Ndarray,for循环中是否有用于以下操作的短numpy命令 import numpy as np a= np.array([1.0,2.0,3.0,4.0,5.0,6.0]) b= np.array([10.0,20.0,30.0]) c= np.array([100.0,200.0,300.0,900.0]) y=np.linspace(0,2,50) m=np.array([0.2,0.1,0.3]) A,C,B,Y = np.meshgrid(a,c,b,y,indexing="ij") p
import numpy as np
a= np.array([1.0,2.0,3.0,4.0,5.0,6.0])
b= np.array([10.0,20.0,30.0])
c= np.array([100.0,200.0,300.0,900.0])
y=np.linspace(0,2,50)
m=np.array([0.2,0.1,0.3])
A,C,B,Y = np.meshgrid(a,c,b,y,indexing="ij")
print Y
for i in range(0,len(a)):
for j in range(0,len(c)):
for k in range(0,len(b)):
Y[i][j][k]=Y[i][j][k]*m[k]
print "--------"
print Y
抽象地说,我有$Y{ijkl}$,我想用$m{0$乘以$Y{ij0l}$,用$m{1$乘以$Y{ij1l}$,依此类推
非常感谢 要删除循环,只需在此处
einsum
np.einsum('ijkl,k->ijkl', Y, m)
或者只是广播乘法:
Y * m[:, None]
但是,如果不想首先创建网格网格,可以先广播
Y
,以提高内存效率
np.einsum(
"ijkl,k->ijkl",
np.broadcast_to(y, a.shape + c.shape + b.shape + y.shape),
m,
)
或:
如果您还需要A、C、B,您可以继续使用当前的方法
性能
美好的这太棒了!这使生活更轻松;)
np.broadcast_to(y, a.shape + c.shape + b.shape + y.shape) * m[:, None]
In [44]: %%timeit
...: np.einsum(
...: "ijkl,k->ijkl",
...: np.broadcast_to(y, (a.shape[0], c.shape[0], b.shape[0], y.shape[0])),
...: m,
...: )
...:
21.1 µs ± 121 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [45]: %%timeit
...: A,C,B,Y = np.meshgrid(a,c,b,y,indexing="ij")
...: for i in range(0,len(a)):
...: for j in range(0,len(c)):
...: for k in range(0,len(b)):
...: Y[i][j][k]=Y[i][j][k]*m[k]
...:
420 µs ± 1.58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)