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

标签 python numpy matrix vector

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

import numpy as np

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

print(A)

结果是:

[[ 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.  ]]

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


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

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

最佳答案

如果您可以处理仅在下三角中有效的结果,那么这个 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

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

出于某种原因,np.multiply.outer() 对于小向量比 np.outer() 更快(对于大向量也不慢)。

关于python - 如何在 Numpy(或其他 Python 解决方案)中利用外积的对称性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51480189/

相关文章:

python - 如何将魔杖图像对象转换为 numpy 数组(没有 OpenCV)?

c - C 中矩阵的每个单元格的递归枚举

python - 删除与另一个数据帧交叉处丢失的数据帧行

python - 字符串的快速串联

python - 如何使用派生自 Python 列表类的类

python - 你能改变 numpy 打印数组的方式吗?

python - 使用距离矩阵计算 Pandas Dataframe 中行之间的距离

python - 如何在重复数字的python中创建矩阵?

python - 将具有分层列索引的宽格式 pandas DataFrame 转换为整齐格式

python - 如何在 pandas 数据框中执行多个条件的 drop_duplicates