如何将"SciPy稀疏矩阵"转换为"NumPy矩阵"?

47 投票
3 回答
97225 浏览
提问于 2025-04-29 18:51

我正在使用一个叫做“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 开始,这些简写会被淘汰。

撰写回答