2011-03-16 256 views
13

我正在使用适用于Python的NetworkX图库。在我的程序中,我希望将我的节点ID“合并”为一系列数字。这是我的天真方法:在NetworkX中移动/重命名节点的最有效方法是什么?

start = 1 # could be anything 
for i, n in enumerate(g.nodes()): 
    if i+start == n: 
     continue 
    g.add_node(i+start, attr_dict=g.node[n]) 
    g.add_edges_from([(i+start, v, g[n][v]) for v in g.neighbors(n)]) 
    g.remove_node(n) 

有没有一种比所有邻居的详尽副本更快的方法?例如,我试过g[i+start] = g[n],但这是被禁止的。

谢谢!

回答

9

这项工作?

http://networkx.github.io/documentation/latest/reference/generated/networkx.relabel.convert_node_labels_to_integers.html

import networkx as nx 
G = nx.Graph() 
G.add_node(1) 
G.add_nodes_from('spam') 
print G.nodes() 

回报:

['a', 1, 's', 'm', 'p'] 
现在

start = 1 
G = nx.convert_node_labels_to_integers(G,first_label=start) 
print G.nodes() 

回报:

[1, 2, 3, 4, 5] 
+0

谢谢乔希!该功能完全符合我的要求。但不幸的是,它不在位,所以看[源代码](https://networkx.lanl.gov/trac/browser/networkx/networkx/convert.py)(第214-357行),它仍然是O(V + E)而不是理论上可能的O(V)。不过,它看起来比我的尝试快了25%。 – Juan 2011-03-17 01:03:41

+1

刚才我发现,考虑到在networkx中实现图的方式,O(V)边界将无法实现。必须访问每条边来重新映射nodeID。 – Juan 2011-03-17 01:53:17