【问题标题】:How do I transform a "SciPy sparse matrix" to a "NumPy matrix"?如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?
【发布时间】: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())

标签: python numpy scipy sparse-matrix networkx


【解决方案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.]])
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2021-11-25
      • 2020-12-07
      • 1970-01-01
      • 2017-07-02
      • 2019-08-17
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      相关资源
      最近更新 更多