2012-04-06 27 views
1

私はpythonをコーディングするのが初めてです。私はこのコードを変更して二部構成の2モードバージョンを開発したいと考えています。幾何乱数グラフを作るために使用されるnetworkxのコードです。私はこの機能のほとんどを把握していますが、94〜99行目が何をしているのかを正確に理解できません。 while、zipやnodes.pop()は理解していますが、他の部分は初心者のために混乱しています。コードのこの部分が与えられた一般的な説明より多くのことを誰かが説明できるように助けてくれますか?networkxコードの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 

答えて

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

コードのこの作品は、まさに一度(そうabの順序がで行われる動作には関係ないはず他のすべてのノードですべてのノードを結合するためにかなり頻繁に見イディオムです# do something部分)。

空リストはwhileループの条件で偽の値とみなされ、空でないリストは真であるとみなされるために機能します。

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

このラインは、二つのベクトルpupvEuclidean distanceの二乗を計算します。これは最高のそれを離れて取ることによって実証されています。私たちは、リストを必要としないので、

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

最後のステップでは、我々は、任意のより多くのリストの内包表記を使用しないでください。 sumは単に反復可能な形式で値を必要とするため、代わりにジェネレータ式を使用します。

+0

小修正:「d」は、ユークリッド距離の* 2乗です。 – Avaris

+0

@Avaris:非常に真実で、ルートの中の用語を計算します:) –

+0

これは本当にいくつかのことをクリアしてくれてありがとうございます。可能であれば、私は1つの最終的なことを尋ねるかもしれない私はちょうどちょうどどこ正確に u、du = nodes.pop() pu = du ['pos'] から来て、何が起こっているかわからない。私は私がしたと思ったが、今あなたの答えがわからない。 最高の願い –