2016-03-22 9 views
0

私はnetworkxと一般的なグラフ作成にはとても新しいので、あなたの助けが必要でした。同じ属性を持つノードが存在しない場合にのみ、ネットワークxにノードを追加してください。

私は、各ノードがnode_id(グラフを作るために反復している点の数だけです)と5つの属性を持つグラフを設計しています。

I.e.

G.add_node(node_id) 
G[id]['Coord1'] = 3 
G[id]['Coord2'] = 7 
G[id]['Coord3'] = None 
G[id]['Coord4'] = None 
G[id]['Coord5'] = None 

は、だから今、私はいくつかの座標で、新しいノードを追加することを検討したいです。

グラフに新しいノードを追加する前に、追加しようとしているノードと同じ属性(コードの1つ)を持っていないノードがないことを確認します。

共有されているcoordを持つノードがすでに存在する場合は、新しいノードを追加するのではなく、単に既存のノードに変更を加えます。

私がこれを行うと考えることができる唯一の方法は、グラフのすべての既存のノードをループし、属性の1つがノードと同じであるかどうかを確認することでした。例えば。

find_node = [attrdict for n,attrdict in G.node.items() if attrdict['coord1'] == tempcoord ]  

ここで、tempcoordは、追加しようとしているノード上の関心のある座標です。

これは、ノードを追加して既存のノードをすべてチェックしたいと思うたびに、これを行うことは明らかに非常に非効率的です。私の質問は次のとおりです。

networkxは同じIDを持つ新しいノードを追加しませんが、同じ属性を共有するノードには拡張されません。

また、すべてのこれらの「重複」ノードを使用してグラフを作成し、すべてのノードを追加した後に共有属性を持つすべてのノードを1つのノードに集約する方が良いでしょうか?

多少畳み込まれた説明に申し訳ありませんが、私はそれが意味をなされることを願っています。

+0

これらの回答は適切ではありませんか? http://stackoverflow.com/questions/23233127/how-to-get-values-from-specific-node-attributes-in-networkx-with-python?rq=1またはhttp://stackoverflow.com/questions/ 15644684/for-query-for-edge-and-node-attributes-in-networkx?rq = 1 – zezollo

+0

こんにちはZezollo、これらのスレッドに感謝します。彼らは間違いなく関連していますが、私の質問に本当に答えませんでした。私は属性値やインデックスのリストを取得する方法を知っており、特定の属性を持つすべてのノードを選択するだけです。私が疑問に思っていたのは、ノードインデックスではなく、固有の属性に基づいてノードにアクセスできるかどうかということでした。 – AHawks

+0

本質的には、ノードインデックスだけでなく複数のハッシュ可能な属性でノードにアクセスできるようにしたいと考えています。これを行う方法はありますか? – AHawks

答えて

1

すべての観測ノード属性を含むセットを作成します。特定の属性を持つノードを追加する場合は、その属性が存在するかどうかを確認します。そうであれば、そうでない場合は何もしないで、追加して属性をセットに入れます。これらのステップがコードのさまざまな部分で実行されている場合、これらのステップを実行する関数を定義する価値があります。

seen_attributes = set() 

# code here adding nodes 

node = node_to_add 
attribute = attribute_of_node 

if attribute not in seen_attributes: 
    G.add_node(node, coord=attribute) 
    seen.add(attribute) 
+0

これは良いアイデアであり、確かにうまくいくはずです。私はキーが属性であった辞書とノードインデックスの値を含むことで自分の問題を解決することができました。そうすれば、辞書のキーをチェックして、それが見つかった場合、ノードがすでに存在することがわかります。 – AHawks

関連する問題