将 python-igraph 图转换为 networkx

Convert python-igraph graph to networkx

最近我一直在使用 python-igraph 包,我的所有代码都基于我使用 igraph 创建的图表。现在,我需要为我的图形计算一些度量,这些度量显然是在 networkx 中实现的,而不是在 igraph 中实现的,例如 (katz_centrality_numpy、edge_betweenness_centrality、...)。我想知道是否有办法在这两个包之间将一个图转换为另一个图,并避免再次读取文件,因为我的文件很大并且必须重复很多相同的过程。

顺便说一下,当我将 igraph 图传递给 networkx 函数时,我收到以下错误:

TypeError: 'Graph' object is not iterable

谢谢:)

您可以启动带边的 networkx 图:

Graph([(1,2), (3,4)])

参见the documentation

编辑:

这是使用方法(感谢 nimafl 提供的代码):

graphigraph 图,我们创建 G 这是一个 networkx 图。

import networkx
A = graph.get_edgelist()
G = networkx.DiGraph(A) # In case your graph is directed
G = networkx.Graph(A) # In case you graph is undirected

好的,所以我自己想出来了。这是你应该做的。假设您的 python.igraph 对象称为图形,我们创建一个名为 G 的 networkx 图形如下:

import networkx as netx

A = [edge.tuple for edge in graph.es]
# In case your graph is directed
G = netx.DiGraph(A)
# In case you graph is undirected
G = netx.Graph(A)

graph.es returns 图边列表,然后将它们全部添加到 A 并使用矩阵 A 在 networkx 中创建一个图。

祝您代码顺利:)

当我尝试在 igraph 或 nx 上存储 nodes/edges 的名称时,这是我的单行版本,它在从 igraph 对象 g 传输到 nx 时也传输节点名称, G、结果:

G = nx.from_edgelist([(names[x[0]], names[x[1]])
                      for names in [g.vs['name']] # simply a let
                      for x in g.get_edgelist()], nx.DiGraph())

此外,如果您需要相反的方法,请查看 this answer

最佳答案很好,但以防万一需要保留节点的顺序(以便对 mNgraph.nodes 进行排序),并且 igraph.Graph 没有节点名称,请考虑使用像

mNgraph = networkx.Graph()
mNgraph.add_nodes_from(range(mIgraph.vcount()))
mNgraph.add_edges_from(mIgraph.get_edgelist())