1

私はPythonのコーディングが初めてです。このコードを変更して、2 部構成の 2 モード バージョンを開発したいと考えています。これは、geometrci ランダム グラフを作成するために使用される networkx のコードです。私はこの関数のほとんどを把握しなければなりませんが、94 行から 99 行が何をしているのか正確に理解するのに苦労しています。while、zip、nodes.pop() は理解できますが、他の部分は初心者にとって混乱を招きます。コードのこの部分が与えられた一般的な説明よりも多くのことを説明してくれる人はいますか?

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
4

1 に答える 1

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

このコード片は、すべてのノードを他のすべてのノードと1 回だけ結合するためのイディオムとして非常によく見られます(したがって、この部分で実行される操作では and の順序は重要ではaありbません# do something)。

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

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

この行は、2 つのベクトルとのユークリッド距離の 2 乗を計算します。これは、分解することで最もよく示されます。pupv

>>> 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反復可能な形式の値が必要なだけなので、代わりにジェネレーター式を使用します。

于 2012-04-06T10:36:01.857 に答える