作为机器学习项目的一部分,我正在做大量的hadamard产品。为了传达问题,下面是设置:
# shape: (2, 3)
In [17]: arr1
Out[17]:
array([[0.44486617, 0.21001534, 0.63833794],
[0.90878526, 0.61692562, 0.01978946]])
# shape: (5, 3)
In [18]: arr2
Out[18]:
array([[0.00640485, 0.22768134, 0.62845291],
[0.58168743, 0.65527711, 0.14765079],
[0.61389269, 0.38546809, 0.62696518],
[0.73977707, 0.03737199, 0.45905132],
[0.51932163, 0.00119124, 0.07241033]])
现在,我想对arr1
中的每一行与arr2
进行hadamard积运算,从而获得形状为{{1}的结果数组,称为res
}。
(10, 3)
如何仅使用NumPy以最小的开销做到这一点?
答案 0 :(得分:1)
在将数组之一扩展到3D
之后,我们可以利用broadcasting
-
(a[:,None]*b).reshape(-1,a.shape[1]) # a,b are input arrays
对于大型阵列,为了通过多核使用来提高内存效率并因此获得性能,我们可以使用numexpr
module-
import numexpr as ne
ne.evaluate('a3D*b',{'a3D':a[:,None]}).reshape(-1,a.shape[1])
时间-
In [20]: a = np.random.rand(200,30)
In [21]: b = np.random.rand(500,30)
In [22]: %timeit (a[:,None]*b).reshape(-1,a.shape[1])
100 loops, best of 3: 4.61 ms per loop
In [27]: %timeit ne.evaluate('a3D*b',{'a3D':a[:,None]}).reshape(-1,a.shape[1])
100 loops, best of 3: 2.28 ms per loop