2011-03-16 67 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

相關問題