加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 将稀疏数组中的元素与矩阵中的行相乘

发布时间:2020-12-16 22:57:41 所属栏目:Python 来源:网络整理
导读:如果你有一个稀疏矩阵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_scoresclass 'numpy.matrixlib.defmatrix.matrix'[[8] [5]] …如
如果你有一个稀疏矩阵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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读