如果你有一个稀疏矩阵X:
>> print type(X)
<class 'scipy.sparse.csr.csr_matrix'>
如何计算每行元素的平方和,并将它们保存到列表中?例如:
>>print X.todense()
[[0 2 0 2]
[0 2 0 1]]
你如何将其转换为每行平方和的列表:
[[0²+2²+0²+2²]
[0²+2²+0²+1²]]
或:
[8, 5]
如果你有一个稀疏矩阵X:
>> print type(X)
<class 'scipy.sparse.csr.csr_matrix'>
如何计算每行元素的平方和,并将它们保存到列表中?例如:
>>print X.todense()
[[0 2 0 2]
[0 2 0 1]]
[[0²+2²+0²+2²]
[0²+2²+0²+1²]]
[8, 5]
首先,csr矩阵有一个.sum
方法(依赖于点积)可以很好地工作,所以你需要做的就是平方。最简单的解决方案是创建稀疏矩阵的副本,对其数据进行平方然后求和:
squared_X = X.copy()
# now square the data in squared_X
squared_X.data **= 2
# and sum each row:
squared_sum = squared_X.sum(1)
# and delete the squared_X:
del squared_X
如果您真的需要节省空间,我想您可以只需替换 .data
然后再把它替换回来,类似这样:
X.sum_duplicate() # make sure, not sure if this happens with normal usage.
old_data = X.data.copy()
X.data **= 2
squared_sum = X.sum(1)
X.data = old_data
编辑: 其实还有另一种很好的方法,因为 csr 矩阵有一个 .multiply
方法可以进行逐元素乘法:
squared_sum = X.multiply(X).sum(1)
补充:逐元素操作可以通过访问csr.data
轻松完成,该数组存储所有非零元素的值。注意:我猜测可能需要使用.sum_duplicates()
,但我不确定什么样的操作会使其必要。
.multiply
方法,我认为对于这个问题来说非常不错。 - seberg