在Python中的稀疏矩阵中按行查找非零条目的快速方法

use*_*497 5 python numpy matrix

我试图在稀疏矩阵中按行查找非零项的索引:scipy.sparse.csc_matrix.到目前为止,我正在遍历矩阵中的每一行,并使用

numpy.nonzero()
Run Code Online (Sandbox Code Playgroud)

到每一行获取非零列索引.但是这种方法需要花费一个多小时才能找到每行的非零列条目.有快速的方法吗?谢谢!

Mad*_*May 7

使用该.nonzero()方法.

indices = sp_matrix.nonzero()
Run Code Online (Sandbox Code Playgroud)

如果你想将索引作为(row, column)元组,你可以使用zip.

indices = zip(*sp_matrix.nonzero())
Run Code Online (Sandbox Code Playgroud)


Jai*_*ime 5

对于企业社会责任矩阵来说,它相对简单,因此您始终可以这样做:

>>> a = sps.rand(5, 5, .2, format='csc')
>>> a.A
array([[ 0.        ,  0.        ,  0.68642384,  0.        ,  0.        ],
       [ 0.46120599,  0.        ,  0.83253467,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.07074811],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.21190832,  0.        ,  0.        ,  0.        ]])
>>> b = a.tocsr()
>>> np.split(b.indices, b.indptr[1:-1])
[array([2]), array([0, 2]), array([4]), array([], dtype=float64), array([1])]
Run Code Online (Sandbox Code Playgroud)


Mar*_*ard 3

如果你使用coo_matrix,这将非常容易,并且coo/csr/csc之间的转换非常快。分别获取所有行索引和列索引可以如下完成:

sp_matrix = sp_matrix.tocoo()
row_ind = sp_matrix.row
col_ind = sp_matrix.col
Run Code Online (Sandbox Code Playgroud)

但是您也可以同时获取任何这些稀疏矩阵类型的两组索引,这可能是最简单的:

rows, cols = X.nonzero()
Run Code Online (Sandbox Code Playgroud)

如果您需要查找特定行中的值,csc 和 csr 矩阵将返回按行排序的非零条目,coo 似乎返回按列排序的索引。

In [1]: X = coo_matrix(([1, 2, 3, 4, 5, 6], ([0, 2, 2, 0, 1, 2], [0, 0, 1, 2, 2, 2])))

In [2]: X.todense()
Out[2]: 
matrix([[1, 0, 4],
        [0, 0, 5],
        [2, 3, 6]])

In [3]: X.nonzero()
Out[3]: 
(array([0, 2, 2, 0, 1, 2], dtype=int32),
 array([0, 0, 1, 2, 2, 2], dtype=int32))

In [4]: X.tocsr().nonzero()
Out[4]: 
(array([0, 0, 1, 2, 2, 2], dtype=int32),
 array([0, 2, 2, 0, 1, 2], dtype=int32))
Run Code Online (Sandbox Code Playgroud)