2011-03-16 16 views
13

Python için NetworkX grafik kitaplığını kullanıyorum. Programımın bir noktasında, nodeID'leri bir sayı dizisine "birleştirmek" istiyorum.NetworkX'te bir düğümü taşımak/yeniden adlandırmak için en etkili yol nedir?

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) 

tüm komşularının bu kapsamlı kopya daha hızlı bir yolu var mı: İşte benim naif bir yaklaşım? Örneğin, g[i+start] = g[n]'u denedim, ancak bu yasak.

Teşekkürler!

cevap

9

Bu işe yarar mı?

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

döner: Şimdi

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

:

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

döner:

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

Teşekkürler Josh! Bu fonksiyon tam olarak istediğim şeyi yapar. Ama ne yazık ki yerinde değil, [kaynak] 'a bakarak (https://networkx.lanl.gov/trac/browser/networkx/networkx/convert.py) (satır 214-357) hala O (V +) E) teorik olarak olası O (V) yerine. Yine de, denememden% 25 daha hızlı görünüyor. – Juan

+1

Şimdiye kadar, grafiklerin networkx'te uygulanma biçimi göz önüne alındığında, O (V) sınırının ulaşılabilir olmayacağı bana göre gerçekleşti. Düğüm kimliğini tekrarlamak için her kenarın ziyaret edilmesi gerekir. – Juan

İlgili konular