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

Posted

技术标签:

【中文标题】如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?【英文标题】:How do I transform a "SciPy sparse matrix" to a "NumPy matrix"? 【发布时间】:2014-12-21 23:31:20 【问题描述】:

我正在使用一个名为“incidence_matrix(G)”的 python 函数,它返回图形的事件矩阵。它来自 Networkx 包。我面临的问题是这个函数的返回类型是“Scipy Sparse Matrix”。我需要有 numpy 矩阵或数组格式的事件矩阵。我想知道是否有任何简单的方法可以做到这一点?或者是否有任何内置函数可以为我做这个转换?

谢谢

【问题讨论】:

实际上是的,它可以工作并为您提供一个数组。我正在寻找一种直接(使用python函数)获取全零和一的矩阵的方法。但是谢谢你,如果我找不到更好的东西,我想最后我会选择数组。 另外,你可能想看看this。 是的,我用过,但问题是当你使用它时,它只将整个稀疏矩阵存储为矩阵中的一个元素。当你想打印它时,你会看到这个:[[',带有8个压缩稀疏列格式的存储元素>]] numpy.matrix(numpy.array(<your_matrix_object>)) 呢? 好的。我想这就是你想要的numpy.matrix(<your_matrix_object>.toarray()) 【参考方案1】:

scipy.sparse.*_matrix 有几个有用的方法,例如,如果 a 是例如scipy.sparse.csr_matrix:

a.toarray()a.A - 返回此矩阵的密集 ndarray 表示。 (numpy.array,推荐) a.todense()a.M - 返回此矩阵的密集矩阵表示。 (numpy.matrix)

【讨论】:

这两个属性有短别名:如果你的稀疏矩阵是a,那么a.M返回一个密集的numpy矩阵对象,a.A返回一个密集的numpy数组对象。除非你有很好的理由(你可能没有!),坚持使用 numpy 数组,即a.A,并远离 numpy 矩阵。【参考方案2】:

我发现在 csr 矩阵的情况下,todense()toarray() 只是简单地包装了元组,而不是以矩阵形式生成数据的 ndarray 格式版本。这对于我正在训练的 skmultilearn 分类器是不可用的。

我把它翻译成lil matrix——一种numpy可以准确解析的格式,然后在上面运行toarray()

sparse.lil_matrix(<my-sparse_matrix>).toarray()

【讨论】:

【参考方案3】:

最简单的方法是对数据调用 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.]])

【讨论】:

以上是关于如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?的主要内容,如果未能解决你的问题,请参考以下文章

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

Scipy 稀疏矩阵作为 DataFrame 列

哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?

将 Python 字典列表转换为 SciPy 稀疏矩阵

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

scipy稀疏矩阵和numpy数组之间的点积给出ValueError