2016-11-11 2 views
1

Ich möchte die Leistung von zwei Graphen vergleichen, die zweite ist eine K n vollständige Grafik. Nennen wir G den ersten Graphen (den nicht vollständigen) und H den zweiten (den K n Graphen). Ich möchte, dass die Knoten von H die exakt gleichen Attribute (und relativen Werte) wie die von G haben, also (scheinbar) kann ich nicht einfach networkx.complete_graph(n) ausführen. Meine erste Idee war es, diesen Code zu verwenden:Schnellste Möglichkeit, einen Graphen in einen vollständigen zu transformieren mit Hilfe von networkx

H = G.copy() 
nh = H.nodes() 
eh = H.edges() # I create those variables in hope to save some speed 
for u in nh: 
    for v in filter(lambda x: x > u, nh): # it's an undirected graph, saves some speed 
     if (u,v) not in eh: 
      H.add_edge(u,v) 

Da jedoch meine Graphen 10.000+ Knoten haben, wird dies ein ziemlich langsamer Prozess. Gibt es eine Möglichkeit, es zu beschleunigen?

+1

Ich denke, die Antwort, die Sie haben, ist wahrscheinlich die beste Option, aber nur ein paar Kommentare zu diesem Code - testen, wenn etwas in einer Liste ist langsam. Stattdessen würdest du 'eh' ein Set machen wollen. Außerdem glaube ich nicht, dass es viel Wert ist zu testen, ob etwas bereits eine Kante ist - ich bin nicht sicher, ob das Hinzufügen einer bereits vorhandenen Kante wesentlich langsamer ist als das erste Testen, wenn die Kante existiert. – Joel

Antwort

0

Ok, ich habe möglicherweise eine Antwort gefunden:

H = networkx.complete_graph(n) 
labels = nx.get_node_attributes(G,attribute) 
nx.set_node_attributes(H,attribute,labels) 

Hat jemand eine schnellere Alternative?

Verwandte Themen