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
?
The function csr_matrix() is used to create a sparse matrix of compressed sparse row format whereas csc_matrix() is used to create a sparse matrix of compressed sparse column format.
from_spmatrix() function. The sparse-from_spmatrix() function is used to create a new DataFrame from a scipy sparse matrix. Must be convertible to csc format. Row and column labels to use for the resulting DataFrame.
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)
Just call my_csr_matrix.nonzero() followed by indexing.
Code:
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)))
print(mtr.todense())
rows, cols = mtr.nonzero()
data = mtr[rows, cols]
print(rows, cols, data)
Output:
[[1 0 2]
[0 0 3]
[4 5 6]]
[0 0 1 2 2 2] [0 2 2 0 1 2] [[1 2 3 4 5 6]]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With