Interface between networkx and igraph

前端 未结 5 1094
被撕碎了的回忆
被撕碎了的回忆 2020-12-29 08:30

I\'ve been working with networkx for quite some time now and it\'s been serving my purposes quite well with minimal tweaks until recently when I started looking into communi

5条回答
  •  爱一瞬间的悲伤
    2020-12-29 08:41

    Here two ways to convert a NetworkX graph to an igraph:

    import networkx as nx, igraph as ig
    
    # create sample NetworkX graph
    g = nx.planted_partition_graph(5, 5, 0.9, 0.1, seed=3)
    
    # convert via edge list
    g1 = ig.Graph(len(g), list(zip(*list(zip(*nx.to_edgelist(g)))[:2])))
      # nx.to_edgelist(g) returns [(0, 1, {}), (0, 2, {}), ...], which is turned
      #  into [(0, 1), (0, 2), ...] for igraph
    
    # convert via adjacency matrix
    g2 = ig.Graph.Adjacency((nx.to_numpy_matrix(g) > 0).tolist())
    
    assert g1.get_adjacency() == g2.get_adjacency()
    

    Using the edge list was somewhat faster for the following 2500-node graph on my machine: (Note that the code below is Python 2 only; I updated the code above to be Python 2/3 compatible.)

    In [5]: g = nx.planted_partition_graph(50, 50, 0.9, 0.1, seed=3)
    
    In [6]: %timeit ig.Graph(len(g), zip(*zip(*nx.to_edgelist(g))[:2]))
    1 loops, best of 3: 264 ms per loop
    
    In [7]: %timeit ig.Graph.Adjacency((nx.to_numpy_matrix(g) > 0).tolist())
    1 loops, best of 3: 496 ms per loop
    

    Using the edge list was also somewhat faster for g = nx.complete_graph(2500).

提交回复
热议问题