3

如果你有一个稀疏矩阵 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]

4

1 回答 1

7

首先,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)

加法: 因此,通过访问which 存储所有非零元素的值,可以轻松完成逐元素操作。注意:我想可能是必要的,我不确定什么样的操作会使其成为必要。csr.data.sum_duplicates()

于 2012-09-02T16:23:44.377 回答