如何将"SciPy稀疏矩阵"转换为"NumPy矩阵"?
我正在使用一个叫做“incidence_matrix(G)”的Python函数,它可以返回图的关联矩阵。这个函数来自Networkx这个库。现在我遇到的问题是,这个函数返回的结果是“Scipy稀疏矩阵”。我需要把关联矩阵转换成numpy矩阵或数组的格式。我在想有没有简单的方法可以做到这一点?或者有没有什么内置的函数可以帮我完成这个转换?
谢谢
3 个回答
2
最简单的方法就是在数据上调用 todense() 这个方法:
In [1]: import networkx as nx
In [2]: G = nx.Graph([(1,2)])
In [3]: nx.incidence_matrix(G)
Out[3]:
<2x1 sparse matrix of type '<type 'numpy.float64'>'
with 2 stored elements in Compressed Sparse Column format>
In [4]: nx.incidence_matrix(G).todense()
Out[4]:
matrix([[ 1.],
[ 1.]])
In [5]: nx.incidence_matrix(G).todense().A
Out[5]:
array([[ 1.],
[ 1.]])
4
我发现,对于csr矩阵来说,todense()
和toarray()
只是把元组包裹起来,而没有生成一个以矩阵形式显示的数据的ndarray。这让我在训练skmultilearn分类器时无法使用。
于是我把它转换成了一种叫做lil矩阵的格式,这种格式numpy可以准确解析,然后在这个格式上运行了toarray()
:
sparse.lil_matrix(<my-sparse_matrix>).toarray()
68
scipy.sparse.*_matrix
是一个很有用的工具,里面有几个实用的方法。例如,如果 a
是一个 scipy.sparse.csr_matrix
的话:
a.toarray()
- 这个方法会把这个矩阵转换成一个密集的数组(也就是numpy.array
,推荐使用)。a.todense()
- 这个方法会把这个矩阵转换成一个密集的矩阵(也就是numpy.matrix
)。
之前,这些方法有简写形式(比如 .A
是 .toarray()
的简写,.M
是 .todense()
的简写),但是从 Scipy v1.14.0 开始,这些简写会被淘汰。