pythonscipysparse-matrix

How to convert a scipy csr_matrix back into lists of row, col and data?


I have a scipy csr_matrix that was created this way as specified in the documentation:

import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
mtr = csr_matrix((data, (row, col)))
mtr.toarray()
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

How do I efficiently convert such a matrix mtr back into the initial three lists row, col and data?


Solution

  • As you noted in a comment, you can get the data by accessing the data attribute. To get the rows and columns, you could convert the array to COO format, and access the data, row and col attributes:

    Here's your array mtr:

    In [11]: mtr
    Out[11]: 
    <3x3 sparse matrix of type '<class 'numpy.int64'>'
        with 6 stored elements in Compressed Sparse Row format>
    
    In [12]: mtr.A
    Out[12]: 
    array([[1, 0, 2],
           [0, 0, 3],
           [4, 5, 6]], dtype=int64)
    

    Convert to COO format, and access the data, row and col attributes.

    In [13]: c = mtr.tocoo()
    
    In [14]: c.data
    Out[14]: array([1, 2, 3, 4, 5, 6], dtype=int64)
    
    In [15]: c.row
    Out[15]: array([0, 0, 1, 2, 2, 2], dtype=int32)
    
    In [16]: c.col
    Out[16]: array([0, 2, 2, 0, 1, 2], dtype=int32)