将2D NumPy数组乘以元素和求和

Vis*_*ath 7 python arrays numpy function

我想知道是否有更快的方式/专用NumPy函数来执行2D NumPy数组的逐元素乘法,然后求和所有元素.我目前使用的np.sum(np.multiply(A, B))地方A,B是等维的NumPy数组m x n.

Div*_*kar 8

你可以用np.tensordot-

np.tensordot(A,B, axes=((0,1),(0,1)))
Run Code Online (Sandbox Code Playgroud)

np.dot压扁输入后的另一种方法-

A.ravel().dot(B.ravel())
Run Code Online (Sandbox Code Playgroud)

另一个np.einsum-

np.einsum('ij,ij',A,B)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

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
Run Code Online (Sandbox Code Playgroud)

运行时测试

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
Run Code Online (Sandbox Code Playgroud)