制作一个小的稀疏矩阵:
In [82]: M = sparse.random(5,5,.2, 'coo')*2
In [83]: M
Out[83]:
<5x5 sparse matrix of type '<class 'numpy.float64'>'
with 5 stored elements in COOrdinate format>
In [84]: print(M)
(1, 3) 0.03079661961875302
(0, 2) 0.722023291734881
(0, 3) 0.547594065264775
(1, 0) 1.1021150713641839
(1, 2) 0.585848976928308
print 以及 nonzero 返回 row 和 col 数组:
In [85]: M.nonzero()
Out[85]: (array([1, 0, 0, 1, 1], dtype=int32), array([3, 2, 3, 0, 2], dtype=int32))
转换为csr 对行(但不一定是列)进行排序。 nonzero 转换回 coo 并以新顺序返回行和列。
In [86]: M.tocsr().nonzero()
Out[86]: (array([0, 0, 1, 1, 1], dtype=int32), array([2, 3, 0, 2, 3], dtype=int32))
我要说转换为csc 对列进行排序,但它看起来不像:
In [87]: M.tocsc().nonzero()
Out[87]: (array([0, 0, 1, 1, 1], dtype=int32), array([2, 3, 0, 2, 3], dtype=int32))
对 csr 的转置产生一个 csc:
In [88]: M.tocsr().T.nonzero()
Out[88]: (array([0, 2, 2, 3, 3], dtype=int32), array([1, 0, 1, 0, 1], dtype=int32))
我没有完全理解您想要做什么,或者您为什么想要列排序,但lil 格式可能会有所帮助:
In [90]: M.tolil().rows
Out[90]:
array([list([2, 3]), list([0, 2, 3]), list([]), list([]), list([])],
dtype=object)
In [91]: M.tolil().T.rows
Out[91]:
array([list([1]), list([]), list([0, 1]), list([0, 1]), list([])],
dtype=object)
一般来说,稀疏矩阵的迭代很慢。 csr 和 csc 格式的矩阵乘法是最快的运算。许多其他操作间接利用了它(例如行总和)。另一组相对较快的操作是可以直接使用data 属性的操作,无需关注行或列值。
coo 不实现索引或迭代。 csr 和 lil 实现这些。