python - 在两个数组的最终轴上按元素相乘

标签 python python-3.x numpy numpy-einsum

给定一个 3d 数组和一个 2d 数组,

a = np.arange(10*4*3).reshape((10,4,3))
b = np.arange(30).reshape((10,3))

如何在每个轴的最终轴上运行元素乘法,从而得到 c,其中 c 的形状 .shape一个? IE。

c[0] = a[0] * b[0]
c[1] = a[1] * b[1]
# ...
c[i] = a[i] * b[i]

最佳答案

在不涉及任何求和缩减的情况下,使用 np.newaxis/Noneb 扩展为 3D 后,简单的广播将非常高效。 -

a*b[:,None,:] # or simply a*b[:,None]

运行时测试 -

In [531]: a = np.arange(10*4*3).reshape((10,4,3))
     ...: b = np.arange(30).reshape((10,3))
     ...: 

In [532]: %timeit np.einsum('ijk,ik->ijk', a, b) #@Brad Solomon's soln
     ...: %timeit a*b[:,None]
     ...: 
100000 loops, best of 3: 1.79 µs per loop
1000000 loops, best of 3: 1.66 µs per loop

In [525]: a = np.random.rand(100,100,100)

In [526]: b = np.random.rand(100,100)

In [527]: %timeit np.einsum('ijk,ik->ijk', a, b)
     ...: %timeit a*b[:,None]
     ...: 
1000 loops, best of 3: 1.53 ms per loop
1000 loops, best of 3: 1.08 ms per loop

In [528]: a = np.random.rand(400,400,400)

In [529]: b = np.random.rand(400,400)

In [530]: %timeit np.einsum('ijk,ik->ijk', a, b)
     ...: %timeit a*b[:,None]
     ...: 
10 loops, best of 3: 128 ms per loop
10 loops, best of 3: 94.8 ms per loop

关于python - 在两个数组的最终轴上按元素相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45986897/

相关文章:

python - 解析包含创建 Django Q 对象逻辑的字符串

python - 录制某个PID Ubuntu的声音

sql - 使用对列表有效地选择 SQL Server 中的行?

python - 如何将 Pandas 序列化为 MessagePack 格式作为 python 缓冲区/内存 View ?

python - NumPy - 实现阈值上限的更快方法

python - 在 PyCharm 中使用 Flask-RESTful

python - 绘制微分方程特解的 Sympy 结果

python - 名称修改示例的问题

python - 使用 numpy 函数

python - 根据Python中另一个数组中包含的True/False值填充2D numpy数组