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