2014-02-09 85 views
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以及稀疏矩阵的,我SciPy的内知道的产品W.

的一个方法不接受稀疏矩阵在右手侧。

>>> 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

矩阵乘法是关联的,所以你可以随时首先计算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,您的特定操作变得surprisin gly整齐编码:

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