如何利用 Numpy(或其他 Python 解决方案)中外积的对称性?

Den*_*ers 5 python numpy vector matrix

假设我们要计算向量与其自身的外积:

import numpy as np

a = np.asarray([1, 1.5, 2, 2.5, 3])
A = np.outer(a, a)

print(A)
Run Code Online (Sandbox Code Playgroud)

结果是:

[[ 1.    1.5   2.    2.5   3.  ]
 [ 1.5   2.25  3.    3.75  4.5 ]
 [ 2.    3.    4.    5.    6.  ]
 [ 2.5   3.75  5.    6.25  7.5 ]
 [ 3.    4.5   6.    7.5   9.  ]]
Run Code Online (Sandbox Code Playgroud)

这导致对称矩阵。可以通过仅计算矩阵的一个三角形并从三角形中的相应条目填充剩余条目来利用外积中的两个向量相同这一事实的先验知识。


问题:有没有简单的方法可以在numpy(或Python中的其他解决方案)中利用这些知识?当然,用 Python 编写自定义解决方案并不会太困难,但如果这是以不使用可靠的 BLAS 为代价的话,那就不太值得了。

我主要关心的是计算时间,而不是 RAM 使用情况。

Joh*_*nck 4

如果您可以处理仅在下三角中有效的结果,那么这个 Numba 解决方案是我想出的最好的解决方案:

import numba

@numba.njit                 
def outer(arr):
    n = len(arr)
    res = np.empty((n,n), arr.dtype)
    for ii in range(n):
        for jj in range(ii+1):
            res[ii,jj] = arr[ii] * arr[jj]
    return res
Run Code Online (Sandbox Code Playgroud)

它的速度是大型向量的两倍np.outer(),小型向量的五倍。如果您需要完全填充的解决方案,您可以res[jj,ii] = res[ii,jj]在内部循环中设置,它仍然比np.outer().

由于某种原因,np.multiply.outer()小向量比大向量更快np.outer()(并且大向量不慢)。