7

疎行列 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

4

3 に答える 3

9

残念ながら、.multiplyCSRマトリックスの方法は、もう一方が密集している場合、マトリックスを高密度化するようです。したがって、これはそれを回避する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マトリックスの場合、同等のものは次のとおりです。

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

CSCマトリックスの場合、同等のものは次のようになります。

Z.data *= Y[Z.indices]
于 2012-09-02T17:22:24.450 に答える