2016-09-07 16 views
3

NetworkXを使用して、次のグラフを作成します。NetworkX - ノード周りのパス

Networkx graph

グラフを使用して作成されます。その二つのノードがそれらの位置に関して変更された後(だけ回答するために必要な、数字ではなく説明するために)

G = nx.grid_2d_graph(4,3) 

G.neighbors((1, 1)) 

出力:次のコードを使用して

[(0, 1), (1, 2), (1, 0), (2, 1)] 

私はほかに必要なものがポイントです:

[(0, 2), (2, 2), (2, 0), (0, 0)] 

これは周囲に "ループ" を構成するだろうその「ループ」内のすべてのノードを含む(1,1)。私はグラフの観点から正しい命名法を知らないので、私が探しているものを検索するのは苦労します。

EDIT:@orestissに触発され、私はこの思い付いたの周りいじるされた後

。それと

l = list() 
center = (1, 1) 
for neighb in G.neighbors(center): 
    others = [n for n in G.neighbors(center) if n != neighb] 
    for other in others: 
     l.append([n for n in nx.common_neighbors(G, neighb, other) if n != center]) 
    l.append([neighb]) 
lf = list(set([item for sublist in l for item in sublist])) 

私はセンター自体を除き、サイクル周りセンターにあるすべてのノードを取得します。 これは境界ノードに対しても機能します。

+0

この概念は、正方格子状に理にかなって、おそらくありません。適切な答えを出すためにこれを探している理由をもう少し詳しく教えてください。 – Joel

+0

私は、CFDシミュレーション(いわゆるブロック構造メッシュ)のメッシュ生成のための方形格子を扱います。メッシュスムージングアルゴリズム(角度ベースのスムージングなど)を実装できるためには、それらのノードへの参照が必要です。私は独自のデータ構造を持っていますが、グラフを採用したいのですが、そこにはすでに他の機能があり、私は自分のプロジェクトに適用することができます。そして私はグラフについてもっと知りたいと思っています:) – chiefenne

答えて

1

私は、この特定のケースでは、あなたの隣人が共通に持っている隣人を見つけるのに十分だと思います。

コードは次のようになります。他のグラフの

in_loop = set() 
root = (1,1) 

for neighb in G.neighbors(root): 
    others = [n for n in G.neighbors((1,1)) if n != neighb] 
    for other in others: 
     if neighb in [x for x in G.neighbors(other) if x != root]: 
       in_loop.add(neighb) 
       break 

print in_loop 
+0

それは私の質問を解決します。論理とコードを提供していただきありがとうございます。それで、それは私には見えますが、それを行うNetworkXには専用の機能はありません。 – chiefenne

+0

あなたは正常です@Andy、コードを実行していないので、正しく動作するためにいくつかの変更が必要な場合があります – orestiss

+0

少し修正する必要がありました。 "if neighbors in"という行には "G.neighbors(neighbors)in"のようなものが必要でした。 共有する前にコードをリファクタリングする必要があります。 – chiefenne

関連する問題