稀疏矩阵的逐元素操作

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]
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)

补充:逐元素操作可以通过访问csr.data轻松完成,该数组存储所有非零元素的值。注意:我猜测可能需要使用.sum_duplicates(),但我不确定什么样的操作会使其必要。


我不确定我理解复制矩阵(示例1)和复制数据(示例2)之间的区别。每种方法的影响是什么? - Zach
1
没有真正的区别。在第二种情况下,您只需保存X.indptr和X.indices的副本,如果您的内存确实很短,这可能是一个要点,并且速度应该会更快。但通常我会使用第一种选项,因为我认为另一种方法只是不必要的魔法。 - seberg
@Zach 添加了.multiply方法,我认为对于这个问题来说非常不错。 - seberg
我们能否不对矩形矩阵进行平方处理? - Hima Varsha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接