假设我们要计算一个向量与其自身的外积:
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/