Mos*_* Xu 12 python igraph networkx
我一直在使用networkx已经有一段时间了,直到最近我开始研究社区检测时,它一直很好地服务于我的目的.相比之下,igraph Python包似乎有更广泛的社区检测方法实现(甚至与添加了Thomas Aynaud社区包的networkx相比).我只是想知道是否有任何现有的,经过测试的API可以轻松地将networkx图转换为igraph结构,所以我可以利用这个领域提供的功率igraph?
非常感谢您的回答.
Ulr*_*ern 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()
Run Code Online (Sandbox Code Playgroud)
对于我的机器上的以下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
Run Code Online (Sandbox Code Playgroud)
使用边缘列表也有点快g = nx.complete_graph(2500)
.
当我尝试在 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())
Run Code Online (Sandbox Code Playgroud)
如果给出了一个 nx 对象 G 但需要一个 igraph 对象,则相反:
g = igraph.Graph.TupleList(G.edges(), directed=True)
Run Code Online (Sandbox Code Playgroud)
当然,这些不是完整的传输,因为缺少其他节点属性和边缘属性传输,但我希望在您没有它们时会有用。
更详细的版本,您可以在从 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()])
Run Code Online (Sandbox Code Playgroud)
从 nx 到 igraph:
g = igraph.Graph(directed=True)
g.add_vertices(G.nodes())
g.add_edges(G.edges())
Run Code Online (Sandbox Code Playgroud)
(也贴在这里)