将 2D NumPy 数组元素相乘并求和

Posted

技术标签:

【中文标题】将 2D NumPy 数组元素相乘并求和【英文标题】:Multiply 2D NumPy arrays element-wise and sum 【发布时间】:2017-11-29 12:59:09 【问题描述】:

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

【问题讨论】:

【参考方案1】:

你可以使用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

【讨论】:

感谢您的分析。在我使用 45x45 数组的应用程序中,我发现 ravel().dot() 选项要快得多。

以上是关于将 2D NumPy 数组元素相乘并求和的主要内容,如果未能解决你的问题,请参考以下文章

Python / numpy:对数组的n个元素求和的最有效方法,以便每个输出元素是前n个输入元素的总和?

按索引对numpy数组的累积求和

numpy数组矩阵相乘的多种方式

卷积神经网络

python使用numpy中的diagonal函数获取2D numpy数组的对角线元素使用numpy中的diagonal函数和sum函数获取2D numpy数组的迹(matrix trace)

保持 Numpy 数组 2D