假设我们要计算向量与其自身的外积:
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. ]]
这导致对称矩阵。可以通过仅计算矩阵的一个三角形并从三角形中的相应条目填充剩余条目来利用外积中的两个向量相同这一事实的先验知识。
Question:有没有简单的方法可以利用这些知识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()
(对于大向量来说并不慢)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)