如何将scipy csr_matrix转换回行,列和数据列表?

时间:2022-11-08 21:23:10

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

我有一个scipy csr_matrix,它是按照文档中的指定方式创建的:

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?

如何有效地将这样的矩阵mtr转换回最初的三个列表行,列和数据?

2 个解决方案

#1


4  

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:

正如您在评论中所述,您可以通过访问数据属性来获取数据。要获取行和列,可以将数组转换为COO格式,并访问data,row和col属性:

Here's your array mtr:

这是你的数组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.

转换为COO格式,并访问data,row和col属性。

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)

#2


3  

Just call my_csr_matrix.nonzero() followed by indexing.

只需调用my_csr_matrix.nonzero(),然后进行索引。

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]]

#1


4  

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:

正如您在评论中所述,您可以通过访问数据属性来获取数据。要获取行和列,可以将数组转换为COO格式,并访问data,row和col属性:

Here's your array mtr:

这是你的数组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.

转换为COO格式,并访问data,row和col属性。

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)

#2


3  

Just call my_csr_matrix.nonzero() followed by indexing.

只需调用my_csr_matrix.nonzero(),然后进行索引。

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]]