【问题标题】:Multiply 2D NumPy arrays element-wise and sum将 2D NumPy 数组元素相乘并求和
【发布时间】: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


    【解决方案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() 选项要快得多。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多