2012-09-02 3 views
5

の行とスパース配列の要素を掛ける:は行列

>> X = csr_matrix([[0,2,0,2],[0,2,0,1]]) 
>> print type(X)  
>> print X.todense()  
<class 'scipy.sparse.csr.csr_matrix'> 
[[0 2 0 2] 
[0 2 0 1]] 

行列Y:

>> print type(Y) 
>> print text_scores 
<class 'numpy.matrixlib.defmatrix.matrix'> 
[[8] 
[5]] 

...どのようにそれぞれの要素を掛けることができます例えば、Yの列によってX:

[[0*8 2*8 0*8 2*8] 
[0*5 2*5 0*5 1*5]] 

または:

[[0 16 0 16] 
[0 10 0 5]] 

私はこの疲れてきましたが、寸法が一致いけないと明らかにそれが動作しません。 Z = X.data * Y

答えて

8

残念ながらCSRマトリックスの.multiply方法は、他の1が密であれば、マトリックスの密度を高めるように思われます。だから、これはそれを避ける一つの方法だろう。

# Assuming that Y is 1D, might need to do Y = Y.A.ravel() or such... 

# just to make the point that this works only with CSR: 
if not isinstance(X, scipy.sparse.csr_matrix): 
    raise ValueError('Matrix must be CSR.') 

Z = X.copy() 
# simply repeat each value in Y by the number of nnz elements in each row: 
Z.data *= Y.repeat(np.diff(Z.indptr)) 

これは、いくつかの一時を作成していますが、少なくともその完全ベクトル化、およびそれが疎行列を緻密化しません。 COOは同等のマトリックスについて


がある:CSCマトリックスについては

Z.data *= Y[Z.row] # you can use np.take which is faster then indexing. 

相当するものは次のようになります。

Z.data *= Y[Z.indices] 
+0

は、それはまた、COO行列で動作しますか? – Zach

+1

いいえ、COOの場合、速度について気にするならば、あなたは 'Z.data * = Y [Z.row]'を実行する必要があります。 – seberg

+0

それは動作します。それは行列を高密度化することなくそれを行いますか? – Zach