我有一个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]])
如何有效地将此类矩阵mtr
转换回最初的三个列表row
,col
和data
?
答案 0 :(得分:5)
正如您在评论中所述,您可以通过访问data
属性来获取数据。要获取行和列,您可以将数组转换为COO格式,并访问data
,row
和col
属性:
这是你的数组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)
转换为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)
答案 1 :(得分:3)
只需拨打my_csr_matrix.nonzero(),然后进行索引。
代码:
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)
输出:
[[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]]