【问题标题】:Multiply array indices with numbers将数组索引与数字相乘
【发布时间】:2020-05-26 00:46:20
【问题描述】:

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}$,我想将 $Y_{ij0l}$ 与 $m_0$ 和 $Y_{ij1l}$ 与 $m_1$ 相乘,依此类推...

提前非常感谢!

【问题讨论】:

    标签: numpy indexing numpy-ndarray


    【解决方案1】:

    要删除循环,您只需要在这里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,
    )
    

    或:

    np.broadcast_to(y, a.shape + c.shape + b.shape + y.shape) * m[:, None]
    

    如果您还需要 A、C、B,您可以继续当前的方法。


    性能

    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)
    

    【讨论】:

    • 不错!这太棒了 !这让生活更轻松;)
    猜你喜欢
    • 2015-08-14
    • 2019-10-10
    • 1970-01-01
    • 2020-04-04
    • 2017-05-20
    • 1970-01-01
    • 2017-12-16
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多