【发布时间】:2017-11-29 12:59:09
【问题描述】:
我想知道是否有更快的方法/专用的 NumPy 函数来执行 2D NumPy 数组的元素乘法,然后对所有元素求和。
我目前使用np.sum(np.multiply(A, B)),其中A、B 是等维的NumPy 数组m x n。
【问题讨论】:
标签: python arrays function numpy
我想知道是否有更快的方法/专用的 NumPy 函数来执行 2D NumPy 数组的元素乘法,然后对所有元素求和。
我目前使用np.sum(np.multiply(A, B)),其中A、B 是等维的NumPy 数组m x n。
【问题讨论】:
标签: python arrays function numpy
你可以使用np.tensordot -
np.tensordot(A,B, axes=((0,1),(0,1)))
在扁平化输入之后使用np.dot 的另一种方式-
A.ravel().dot(B.ravel())
另一个np.einsum -
np.einsum('ij,ij',A,B)
示例运行 -
In [14]: m,n = 4,5
In [15]: A = np.random.rand(m,n)
In [16]: B = np.random.rand(m,n)
In [17]: np.sum(np.multiply(A, B))
Out[17]: 5.1783176986341335
In [18]: np.tensordot(A,B, axes=((0,1),(0,1)))
Out[18]: array(5.1783176986341335)
In [22]: A.ravel().dot(B.ravel())
Out[22]: 5.1783176986341335
In [21]: np.einsum('ij,ij',A,B)
Out[21]: 5.1783176986341326
运行时测试
In [23]: m,n = 5000,5000
In [24]: A = np.random.rand(m,n)
...: B = np.random.rand(m,n)
...:
In [25]: %timeit np.sum(np.multiply(A, B))
...: %timeit np.tensordot(A,B, axes=((0,1),(0,1)))
...: %timeit A.ravel().dot(B.ravel())
...: %timeit np.einsum('ij,ij',A,B)
...:
10 loops, best of 3: 52.2 ms per loop
100 loops, best of 3: 19.5 ms per loop
100 loops, best of 3: 19.5 ms per loop
100 loops, best of 3: 19 ms per loop
【讨论】: