在Python中将稀疏矩阵转换为列表嵌套列表

3
我希望将一个稀疏矩阵转换为非零索引列表,如下所示:
>>> row = array([0,2,2,0,1,2])
>>> col = array([0,0,1,2,2,2])
>>> data = array([1,1,1,1,1,1])
>>> mat = csc_matrix( (data,(row,col)), shape=(3,3) )
>>> mat.todense() 
matrix([[1, 0, 1],
    [0, 0, 1],
    [1, 1, 1]])
>>> convert(mat)
[[0, 2],[2],[0, 1, 2]]

2
我不清楚convert的输出与mat有什么关系。 - Fred Foo
我要更强烈地表达:我不知道convert的输出与mat有什么关系,或者更重要的是,与输入的row/col/data有什么关系。 - Karl Knechtel
非零索引列表 - zedouard
哦,对了,你也改变了输出的第三个值。抱歉,我没看到。 - Fred Foo
@zedouard:你是在寻找非零条目,还是在寻找出现在稀疏模式中的条目? - Sven Marnach
2个回答

1

也许类似于这样

>>> from numpy import array
>>> from scipy.sparse import csc_matrix
>>> 
>>> row = array([0,2,2,0,1,2])
>>> col = array([0,0,1,2,2,2])
>>> data = array([1,1,1,1,1,1])
>>> mat = csc_matrix( (data,(row,col)), shape=(3,3) )
>>> [list(line.nonzero()[1]) for line in mat]
[[0, 2], [2], [0, 1, 2]]

需要帮忙吗? 无论如何,你应该看一下nonzero


是的,我正在寻找类似的东西,但我想知道是否存在一个函数来完成这个操作。 - zedouard
也许你可以用 mat.nonzero() 的输出来解决问题? - Sven Marnach
[mat[i].nonzero()[1] 的列表,i的范围是从0到mat.shape[0]],“对于mat中的每一行”不起作用。 - zedouard
@zedouard:除非有我没有考虑到的边缘情况,否则它应该可以工作。它为什么不能工作? - DSM

1

也许你正在寻找类似这样的东西:

>>> [mat.indices[mat.indptr[i]:mat.indptr[i+1]]
     for i in range(len(mat.indptr) - 1)]
[array([0, 2]), array([2]), array([0, 1, 2])]

虽然不确定这是有什么用处,但你试图实现的目标很可能有更好的方法。


这是非常特定于CSC/CSR格式的。@DSM的基于nonzero的答案适用于所有scipy.sparse类型。 - Fred Foo
@larsmans:重要的区别在于,这个答案给出了稀疏模式,而DSM的答案给出了非零元素。我认为没有一种类型不可知的方法来获取稀疏模式。另外请注意,DSM的答案对于“coo_matrix”和“dia_matrix”无效。 - Sven Marnach

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