Python Numpy-矩阵乘法在有许多零项的情况下更快?
问题:在numpy中,我有一个矩阵Python Numpy-矩阵乘法在有许多零项的情况下更快?,python,numpy,matrix-multiplication,multiplication,symmetric,Python,Numpy,Matrix Multiplication,Multiplication,Symmetric,问题:在numpy中,我有一个矩阵M1,我正在与另一个矩阵M2相乘 我知道我可以在M1中保留一半的值,因为生成的矩阵是对称的,我只需要顶部的k值 因此,我想使用numpy.tril将一半的值归零,希望底层C函数对于乘法a*b更快,其中a==0,因为它们可以在看到a==0时立即停止,而不是执行整个浮点操作 我知道我可以计时,但我认为这是一个普遍感兴趣的问题 请注意,M1不是稀疏的,只是不需要考虑其中的一半 也许有更好的方法可以节省50%的计算量 背景:这与 p(A|B)*p(B) == p(B|A
M1
,我正在与另一个矩阵M2
相乘
我知道我可以在M1
中保留一半的值,因为生成的矩阵是对称的,我只需要顶部的k
值
因此,我想使用numpy.tril
将一半的值归零,希望底层C函数对于乘法a*b
更快,其中a==0
,因为它们可以在看到a==0
时立即停止,而不是执行整个浮点操作
我知道我可以计时,但我认为这是一个普遍感兴趣的问题
请注意,M1
不是稀疏的,只是不需要考虑其中的一半
也许有更好的方法可以节省50%的计算量
背景:这与
p(A|B)*p(B) == p(B|A)*p(A)
。。。如果你明白我的意思
示例:这只是发生的一点,但最终,我们得到了
- a | a | x | a |矩阵
(a和B是相同的变量)p(a | B)
- a 1 x a矩阵
p(B)
- 结果是a | a | x | a |矩阵
,其中我们不关心对角线,因为它是给定值本身的概率,对角线上方或下方的部分是另一半的重复。很好的精神检查,但毕竟没有必要p(a,B)=p(a | B)*p(B)
这毕竟没有道理。唯一的选择是创建重建三角形的
M1.shape[0]-1
子矩阵,但这肯定会产生太多的开销。你能再现最小的代表性M1和M2吗?IIUC你可以做:r,c=np.triu_索引(M1.shape[0])
然后:np einsum('ij,ij->i',M1[r],M2[c])
,但是不要认为它会给你带来任何性能上的好处,因为矩阵乘法太快,然后tril
运算也不太重。我目前正在检查另一种方法,但我认为上面的建议总体上很有趣。这可能会引起一些兴趣-。我倾向于同意@Divakar的观点结语。顺便说一句,如果你对M1*M2和M1_*M2的建议进行计时,你不会得到显著的差异。我不认为与零相乘可以提高性能。它仍然是一个普通的浮点计算。