Python 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

问题:在numpy中,我有一个矩阵
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 |矩阵
    p(a | B)
    (a和B是相同的变量)
  • a 1 x a矩阵
    p(B)
  • 结果是a | a | x | a |矩阵
    p(a,B)=p(a | B)*p(B)
    ,其中我们不关心对角线,因为它是给定值本身的概率,对角线上方或下方的部分是另一半的重复。很好的精神检查,但毕竟没有必要
注意,这里它实际上不是点积。但是我想导致p(A | B)的计算中有一半是不必要的

更新:我将为此应用程序寻找一种更合理的方法,即限制a和B不相交。然后所有矩阵的大小都减小。它可以在numpy中优雅地完成,但会增加阅读代码的复杂性


这毕竟没有道理。唯一的选择是创建重建三角形的
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的建议进行计时,你不会得到显著的差异。我不认为与零相乘可以提高性能。它仍然是一个普通的浮点计算。