2012-04-06 14 views
1

Ich bin neu in der Codierung von Python. Ich hoffe, diesen Code zu ändern, um eine zweiteilige Version mit zwei Modi zu entwickeln. Es ist Code von networkx, der verwendet wird, um ein geometrisches Zufallsdiagramm zu erstellen. Ich habe mich mit den meisten dieser Funktionen beschäftigt, aber ich habe Probleme, genau zu verstehen, welche Zeilen 94 bis 99 tun. Ich verstehe zwar, zip und nodes.pop(), aber andere Teile sind für einen Neuling verwirrend. Kann jemand mit einer Erklärung dafür helfen, was dieser Teil des Codes mehr tut als die allgemeine Beschreibung?Erklärung für NetworkX-Code Python

G=nx.Graph() 
G.name="Random Geometric Graph" 
G.add_nodes_from(range(n)) 
if pos is None: 
    # random positions 
    for n in G: 
     G.node[n]['pos']=[random.random() for i in range(0,dim)] 
else: 
    nx.set_node_attributes(G,'pos',pos) 
# connect nodes within "radius" of each other 
# n^2 algorithm, could use a k-d tree implementation 
nodes = G.nodes(data=True) 
while nodes:    #line94 
    u,du = nodes.pop() 
    pu = du['pos'] 
    for v,dv in nodes: 
     pv = dv['pos'] 
     d = sum(((a-b)**2 for a,b in zip(pu,pv))) #line99 
     if d <= radius**2: 
      G.add_edge(u,v) 
return G 

Antwort

2
nodes = [some list] 
while nodes: 
    a = nodes.pop() 
    for b in nodes: 
    # do something 

Dieses Stück Code ist ein recht häufig gesehen Idiom jeden Knoten mit jedem anderen Knoten zu kombinieren genau einmal (so die Reihenfolge der a und b nicht für den Betrieb in dem ausgeführt Rolle sollte # do something Teil).

Es funktioniert, weil die leere Liste im Zustand der while-Schleife als ein falscher Wert betrachtet wird, während nicht leere Listen als boolescher Wert betrachtet werden.

d = sum(((a-b)**2 for a,b in zip(pu,pv))) 

Diese Linie berechnet das Quadrat der Euclidean distance der beiden Vektoren pu und pv. Dies wird am besten gezeigt, indem sie auseinander zu nehmen:

>>> pu = (6,6,6) 
>>> pv = (1,3,7) 
>>> zip(pu, pv) 
[(6, 1), (6, 3), (6, 7)] 
>>> [(a-b) for a,b in zip(pu, pv)] 
[5, 3, -1] 
>>> [(a-b)**2 for a,b in zip(pu, pv)] 
[25, 9, 1] 
>>> sum((a-b)**2 for a,b in zip(pu, pv)) 
35 

Im letzten Schritt, wir verwenden keine Liste Verständnis mehr, weil wir keine Liste benötigen. sum benötigt nur die Werte in einer iterierbaren Form, daher verwenden wir stattdessen einen Generatorausdruck.

+0

geringfügige Korrektur: 'd 'ist das * Quadrat * der euklidischen Distanz. – Avaris

+0

@Avaris: Sehr wahr, es berechnet den Begriff innerhalb der Wurzel :) –

+0

Vielen Dank das hatte wirklich einige Dinge aus gelöscht. Wenn möglich, darf ich eine letzte Frage stellen. Ich eine nicht sicher, wo genau die u, du = nodes.pop() pu = du [ 'pos'] herkommt und was geschieht. Ich dachte, dass ich tat, aber jetzt sehe ich deine Antwort bin nicht so sicher. die besten Wünsche –