networkx和igraph之间的接口

时间:2014-04-23 06:00:03

标签: python networkx igraph

我一直在使用networkx已经有一段时间了,直到最近我开始研究社区检测时,它一直很好地完成了我的目的。相比之下,igraph Python包似乎有更广泛的社区检测方法实现(甚至与添加了Thomas Aynaud社区包的networkx相比)。我只是想知道是否有任何现有的,经过测试的API可以轻松地将networkx图转换为igraph结构,所以我可以利用这个领域提供的功率igraph?

非常感谢您的回答。

5 个答案:

答案 0 :(得分:11)

这里有两种将NetworkX图转换为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()

对于我的机器上的以下2500节点图表,使用边缘列表有点快:(请注意,下面的代码只是Python 2;我更新了上面的代码以兼容Python 2/3。)

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

对于g = nx.complete_graph(2500),使用边缘列表也有点快。

答案 1 :(得分:6)

Networkx和python-igraph都支持各种读/写算法(networkxpython-igraph)。

至少有两种格式(GML和pajek)在两者之间似乎很常见,尽管我没有尝试过。

答案 2 :(得分:4)

当我尝试在igraph或nx上存储节点/边的名称时,这是我的单行版本,它也会在从igraph对象g转移到nx时传输节点名称:

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())

如果给出G,一个nx对象,但是需要一个igraph对象,反之亦然:

g = igraph.Graph.TupleList(G.edges(), directed=True)

当然这些并不是完全转移,因为其他节点属性和边缘属性转移都缺失了,但我希望当你没有这些属性转移时它们会很有用。

更多详细版本,您在转移时可以更好地控制,从igraph到nx:

G = nx.DiGraph()
names = g.vs['name']
G.add_nodes_from(names)
G.add_edges_from([(names[x[0]], (names[x[1]])) for x in g.get_edgelist()])

从nx到igraph:

g = igraph.Graph(directed=True)
g.add_vertices(G.nodes())
g.add_edges(G.edges())

(也发布了here

答案 3 :(得分:2)

GML Pajek 旁边,这是我使用 GraphML 传输图形的方式。 Edgelist 也可以,但是主要缺点是它会丢弃节点标识符。

我使用R-iGraph导出了无向图(请参见python igraph中的类似功能)

write_graph(igraphNetwork, exportFilePath, format = "graphml") 与exportFilePath是例如“ folder / yournetwork.graphml”

并通过python-networkX导入并按节点属性名称重新标记: import networkx as nx G = nx.read_graphml(exportFilePath) G = nx.relabel_nodes(G, nx.get_node_attributes(G, 'name'))

这样,我保留了节点标识符。

答案 4 :(得分:0)

python-igraph的{​​{3}}中,或者如果您安装upcoming release,这将和

import igraph
g = igraph.Graph.from_networkx(G)

有关此操作的源代码可以在from source中找到。