如果你有一个稀疏矩阵X:
>> X = csr_matrix([[0,2,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.
解决方法
不幸的是,如果另一个密集的话,CSR矩阵的.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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。