2012-09-02 151 views
5

如果你有稀疏矩陣X行:與元素在矩陣

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

...你怎麼能乘的每一個元素X由Y的行例如:

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

不幸的是企業社會責任矩陣的.multiply方法似乎是緻密的基質,如果另外一個是密集。因此,這將是一個避免方式:

# 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矩陣等價物是:

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

對於CSC矩陣等價是:

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

難道也與COO矩陣工作? – Zach

+1

不,對於首席運營官,您需要做'Z.data * = Y [Z.row]'我想,或者np.take而不是索引,如果您關心速度。 – seberg

+0

工作。它是這樣做的,沒有對矩陣進行緻密化? – Zach