将python-igraph图转换为networkx

时间:2015-04-21 21:52:35

标签: python converter igraph networkx

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

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

TypeError: 'Graph' object is not iterable

谢谢:)

4 个答案:

答案 0 :(得分:3)

您可以使用边缘启动网络x图:

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

请参阅the documentation

修改

这是如何使用它(谢谢nimafl的代码):

graphigraph图表,我们创建的Gnetworkx图表。

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

答案 1 :(得分:1)

当我尝试在igraph或nx上存储节点/边的名称时,这是我的单行版本,它也会在从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

答案 2 :(得分:0)

好的,我自己弄清楚了。这是你应该做的。假设你的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返回图形边缘列表,然后将它们全部添加到A并使用矩阵A在networkx中创建图形。

祝你的代码好运:))

答案 3 :(得分:0)

最有效的答案很好,但是如果万一需要保留节点的顺序(以便对mNgraph.nodes进行排序),而igraph.Graph没有节点名称,请考虑使用类似的

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