python 矩阵对角线上行的负总和有效

python negative sum of rows on matrix diagonal efficiently

我需要对矩阵的行求和,取反,然后将它们放在原始矩阵或非对角线项为零的矩阵的对角线上。有效的是

 Mat2 = numpy.diag(numpy.negative(numpy.squeeze(numpy.asarray(numpy.sum(Mat1,axis=1))))

有没有 cleaner/faster 方法来做到这一点?我正在尝试优化一些代码。

我认为 np.diag(-Mat1.A.sum(1)) 会产生相同的结果:

>>> Mat1 = np.matrix(np.random.rand(3,3))
>>> Mat1
matrix([[ 0.35702661,  0.0191392 ,  0.34793743],
        [ 0.9052968 ,  0.16182118,  0.2239716 ],
        [ 0.57865916,  0.77934846,  0.60984091]])
>>> Mat2 = np.diag(np.negative(np.squeeze(np.asarray(np.sum(Mat1,axis=1)))))
>>> Mat2
array([[-0.72410324,  0.        ,  0.        ],
       [ 0.        , -1.29108958,  0.        ],
       [ 0.        ,  0.        , -1.96784852]])
>>> np.diag(-Mat1.A.sum(1))
array([[-0.72410324,  0.        ,  0.        ],
       [ 0.        , -1.29108958,  0.        ],
       [ 0.        ,  0.        , -1.96784852]])

请注意,矩阵在 numpy 中有点令人头疼——数组通常更方便——它们唯一的句法优势,即更简单的乘法,现在已经不再重要 @ 用于现代矩阵乘法 Python.

如果 Mat1 是一个数组而不是矩阵,那么您就不需要 .A 了。