【问题标题】:Graph.get_adjacency() is slow and the output is strangeGraph.get_adjacency() 很慢,输出很奇怪
【发布时间】:2015-03-26 09:14:54
【问题描述】:

考虑 python-igraph 0.7 中的图形对象 G。如果要G的邻接矩阵A,就得写A=G.get_adjacency(),但是有两个问题:

  1. 即使G是稀疏的有3000个节点,在我的商用笔记本电脑上长时间生成A。会不会是邻接矩阵的创建成本这么高?
  2. 输出 A 是一个 Matrix 对象,所以如果我想对 A 上的 numpy 模块进行操作,我必须先将其转换为列表,然后转换为 numpy.matrix。此外,如果 A 是稀疏的,我需要在稀疏 scipy 矩阵中进行第三次转换。

Igraph 中是否有任何方法可以在合理的时间内获得稀疏图的 scipy.sparse 矩阵?

【问题讨论】:

    标签: python sparse-matrix igraph


    【解决方案1】:
    1. 图形是否稀疏并不重要,因为 igraph 仍会创建密集矩阵,因此它是 O(n2) 操作。 (从技术上讲,矩阵本身是在 C 层中创建的,其中矩阵初始化为全零需要 O(n2),然后用 O(m) 中的一个填充,其中 n 是顶点的数量和 m 是边的数量 - 但随后矩阵被转发到 Python 层,在那里它被转换为 Matrix 对象,而 Python 层不知道矩阵本质上是稀疏的,所以它需要 O(n 2) 进行转换,在我的笔记本电脑上,为具有 3000 个节点的图创建邻接矩阵大约需要 500 毫秒,我认为这可能是正常的。

    2. 是的,有一种方法可以直接从 igraph 图创建稀疏矩阵,尽管它有点冗长:

      from scipy.sparse import coo_matrix
      from numpy import hstack, ones
      
      def graph_to_sparse_matrix(graph):
          xs, ys = map(array, zip(*graph.get_edgelist()))
          if not graph.is_directed():
              xs, ys = hstack((xs, ys)).T, hstack((ys, xs)).T
          else:
              xs, ys = xs.T, ys.T
          return coo_matrix((ones(xs.shape), (xs, ys)))
      

    这个版本在我的机器上大约 26 毫秒内将相同的图形转换为 SciPy 稀疏矩阵。

    【讨论】:

      猜你喜欢
      • 2023-01-29
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2019-01-03
      • 2021-02-27
      • 2018-09-12
      相关资源
      最近更新 更多