用稀疏矩阵表示乘法密集矩形矩阵

时间:2014-02-09 02:27:01

标签: python numpy matrix scipy sparse-matrix

我正在使用Python,Numpy和Scipy包进行矩阵计算。我试图执行计算X.transpose() * W * X,其中X是2x3密集矩阵,W是稀疏对角矩阵。 (下面非常简化的例子)

import numpy
import scipy.sparse as sp

X = numpy.array([[1, 1, 1],[2, 2, 2]])

W = sp.spdiags([1, 2], [0], 2, 2).tocsr()

我需要找到密集矩阵X.transpose和稀疏矩阵W的乘积。

我知道scipy中的一种方法不接受右侧的稀疏矩阵。

>>> sp.csr_matrix.dot(X.transpose(), W)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method dot() must be called with csr_matrix instance as first argument (got ndarray instance instead)

有没有办法将稀疏和密集矩阵相乘,其中稀疏矩阵是scipy右边的术语?如果没有,那么在不将W变成密集矩阵的情况下,最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

矩阵乘法是关联的,因此您始终可以先计算W * X

>>> X.T.dot(W.dot(X))
array([[9, 9, 9],
       [9, 9, 9],
       [9, 9, 9]])

如果你真的需要计算X.T * W,第一个密集,第二个稀疏,你可以让稀疏矩阵__mul__方法为你处理它:

>>> X.T * W
array([[1, 4],
       [1, 4],
       [1, 4]])

实际上,对于您的用例,如果您使用np.matrix而非np.array,则您的特定操作会变得非常巧妙地代码:

>>> Y = np.matrix(X)
>>> Y.T * W * Y
matrix([[9, 9, 9],
        [9, 9, 9],
        [9, 9, 9]])
相关问题