Zac*_*ach 2 python numpy scipy sparse-matrix
如果你有一个稀疏矩阵X:
>> print type(X)
<class 'scipy.sparse.csr.csr_matrix'>
Run Code Online (Sandbox Code Playgroud)
...如何将每行中每个元素的平方相加,并将它们保存到列表中?例如:
>>print X.todense()
[[0 2 0 2]
[0 2 0 1]]
Run Code Online (Sandbox Code Playgroud)
如何将其转换为每行的平方和列表:
[[0²+2²+0²+2²]
[0²+2²+0²+1²]]
Run Code Online (Sandbox Code Playgroud)
要么:
[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
Run Code Online (Sandbox Code Playgroud)
如果你真的必须保存空间,我想你可以只需更换.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
Run Code Online (Sandbox Code Playgroud)
编辑:实际上还有另一种不错的方法,因为csr矩阵有一个.multiply元素乘法的方法:
squared_sum = X.multiply(X).sum(1)
Run Code Online (Sandbox Code Playgroud)
此外:
的elementwise操作因此容易通过访问完成csr.data,其存储的值的所有非零元素.注意:我猜.sum_duplicates()可能是必要的,我不确定哪种操作会使它成为必要.