在两个数组的最终轴上乘以元素

时间:2017-08-31 17:12:38

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

给定一个3d数组和一个二维数组,

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

如何在每个轴的最终轴上运行元素乘法,导致c c的形状.shapea?即

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

2 个答案:

答案 0 :(得分:2)

在没有涉及任何总和减少的情况下,使用np.newaxis/Nonebroadcasting延长到b后,简单的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

答案 1 :(得分:1)

使用np.einsum

c = np.einsum('ijk,ik->ijk', a, b)

快速检查:

print(np.allclose(c[0], a[0] * b[0]))
print(np.allclose(c[1], a[1] * b[1]))
print(np.allclose(c[-1], a[-1] * b[-1]))
# True
# True
# True