2014-02-09 217 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]])