Graph.get_adjacency()很慢,输出很奇怪

时间:2015-01-27 16:59:06

标签: python sparse-matrix igraph

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

  1. 即使G稀疏,有3000个节点,我的商用笔记本电脑也会长时间生成A.是否有可能创建邻接矩阵如此昂贵?
  2. 输出A是一个Matrix对象,所以如果我想在A上使用numpy模块,我必须先在列表中转换它,然后在numpy.matrix中转换它。此外,如果A是稀疏的,我需要在稀疏的scipy矩阵中进行第三次转换。
  3. 在Igraph中是否有任何方法可以在合理的时间内获得稀疏图的scipy.sparse矩阵?

1 个答案:

答案 0 :(得分:4)

  1. 图表是否稀疏并不重要,因为igraph仍然会创建一个密集矩阵,因此它是一个O(n 2 )运算。 (从技术上讲,矩阵本身是在C层创建的,矩阵初始化为全零,取O(n 2 ),然后用O(m)中的矩阵填充,其中n是顶点的数量和m是边的数量 - 然后矩阵被转发到Python层,在那里它被转换为Matrix对象,并且Python层不知道矩阵本质上是稀疏的,所以需要O(n转换它,在我的笔记本电脑上,为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)))
    
  3. 此版本在我的机器上将〜26毫秒内的相同图形转换为SciPy稀疏矩阵。