Zac*_*ach 6 python numpy matrix scipy sparse-matrix
如果你有一个稀疏矩阵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]]
Run Code Online (Sandbox Code Playgroud)
矩阵Y:
>> print type(Y)
>> print text_scores
<class 'numpy.matrixlib.defmatrix.matrix'>
[[8]
[5]]
Run Code Online (Sandbox Code Playgroud)
...如何将X的每个元素乘以Y的行.例如:
[[0*8 2*8 0*8 2*8]
[0*5 2*5 0*5 1*5]]
Run Code Online (Sandbox Code Playgroud)
要么:
[[0 16 0 16]
[0 10 0 5]]
Run Code Online (Sandbox Code Playgroud)
我已经厌倦了这个,但显然它不起作用,因为尺寸不匹配:
Z = X.data * Y
不幸的是,.multiply如果另一个密集的话,CSR矩阵的方法似乎会使矩阵变得密集.所以这将是一种避免这种情况的方法:
# 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))
Run Code Online (Sandbox Code Playgroud)
这确实会产生一些临时性,但至少它是完全矢量化的,并且它不会使稀疏矩阵变得密集.
对于COO矩阵,等价物是:
Z.data *= Y[Z.row] # you can use np.take which is faster then indexing.
Run Code Online (Sandbox Code Playgroud)
对于CSC矩阵,等价物将是:
Z.data *= Y[Z.indices]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2530 次 |
| 最近记录: |