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

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")

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)