如何在Numpy(或其他Python解决方案)中利用外部产品的对称性?
假设我们要计算向量与其自身的外积:如何在Numpy(或其他Python解决方案)中利用外部产品的对称性?,python,numpy,matrix,vector,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.
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()的两倍,对于小向量,它的速度是np.outer()的五倍。如果需要完全填充的解决方案,可以在内部循环中设置res[jj,ii]=res[ii,jj]
,它仍然比np.outer()快一些
出于某种原因,np.multiply.outer()
对于小向量比np.outer()
快(对于大向量也不慢)。实际输入向量的维数是多少?@JohnZwinck通常大约是25-50英寸,大致是这个顺序。不是很大,我有很多像这样的外部产品。分析表明,如果可能的话,这是值得优化的部分之一(具体来说,numeric.py:1076(outer)
调用显示得非常高)。对于如此小的尺寸,您可以使用:np.dot(a[:,None],a[None])
following-。我们几天前刚刚探讨过这一点。在这些测试中,einsum
具有适度的时间优势。