scipy 稀疏矩阵排序

wtzytmuj  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(173)

我有一个稀疏矩阵。我需要对这个矩阵逐行排序,并创建另一个[稀疏]矩阵。代码可能会更好地解释它:

# for `rand` function, you need newer version of scipy.
from scipy.sparse import *
m = rand(6,6, density=0.6)
d = m.getrow(0)
print d

输出1

(0, 5) 0.874881629788 
(0, 4) 0.352559852239 
(0, 2) 0.504791645463 
(0, 1) 0.885898140175

我有这个m矩阵。我想创建一个新的矩阵,其中包含排序后的m。新矩阵包含第0行,如下所示。

new_d = new_m.getrow(0)
print new_d

输出2

(0, 1) 0.885898140175
(0, 5) 0.874881629788  
(0, 2) 0.504791645463
(0, 4) 0.352559852239

所以我可以得到哪个列更大等等:

print new_d.indices

输出3

array([1, 5, 2, 4])

当然,每一行都应该像上面那样独立排序。
我有一个解决这个问题的方法,但它并不优雅。

frebpwbc

frebpwbc1#

如果你愿意忽略矩阵中的零值元素,下面的代码应该可以工作。它也比使用getrow方法的实现快得多,后者相当慢。

def sort_coo(m):
    tuples = zip(m.row, m.col, m.data)
    return sorted(tuples, key=lambda x: (x[0], x[2]))

例如:

>>> from numpy.random import rand
    >>> from scipy.sparse import coo_matrix
    >>>
    >>> d = rand(10, 20)
    >>> d[d > .05] = 0
    >>> s = coo_matrix(d)
    >>> sort_coo(s)
    [(0, 2, 0.004775589084940246),
     (3, 12, 0.029941507166614145),
     (5, 19, 0.015030386789436245),
     (7, 0, 0.0075044957259399192),
     (8, 3, 0.047994403933129481),
     (8, 5, 0.049401058471327031),
     (9, 15, 0.040011608000125043),
     (9, 8, 0.048541825332137023)]

根据你的需要,你可能想调整lambda中的排序键,或者进一步处理输出。如果你想把所有的东西都放在一个行索引字典中,你可以这样做:

from collections import defaultdict

sorted_rows = defaultdict(list)

for i in sort_coo(m):
     sorted_rows[i[0]].append((i[1], i[2]))
pb3s4cty

pb3s4cty2#

我的坏解决方案是这样的:

from scipy.sparse import coo_matrix
import numpy as np
a = []
for i in xrange(m.shape[0]): # assume m is square matrix.
   d = m.getrow(i)
   n = len(d.indices)
   s = zip([i]*n, d.indices, d.data)
   sorted_s = sorted(s, key=lambda v: v[2], reverse=True)
   a.extend(sorted_s)
a = np.array(a)
new_m = coo_matrix((a[:,2], (a[:,0], a[:,1])), m.shape)

上面可能有一些简单的错误,因为我还没有检查过。但是我想这个想法是直观的。有什么好的解决方案吗?

编辑

这个新的矩阵创建可能是无用的,因为如果你调用getrow方法,那么顺序又被打破了。只有coo_matrix.col保持顺序。

其他解决方案

这不是一个精确的解决方案,但它可能是有帮助的:
x一个一个一个一个x一个一个二个x

相关问题