首页 文章

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

提问于
浏览
1

我正在使用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 回答

  • 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]])
    

相关问题