2016-09-07 5 views
3

Ich verwende NetworkX, um das folgende Diagramm zu erstellen.NetworkX - Pfad um einen Knoten

Networkx graph

Der Graph erstellt wird:

G = nx.grid_2d_graph(4,3) 

Danach zwei Knoten modifiziert werden im Hinblick auf ihre Positionen (nur die Figur zu erklären, nicht notwendig für die Antwort).

Verwendung des folgenden Codes:

G.neighbors((1, 1)) 

Ausgänge:

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

Was ich dazu brauchen, sind die Punkte:

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

Dies würde eine "Schleife" machen rund (1, 1) enthält alle Knoten in dieser "Schleife". Da ich die korrekte Benennung in Graphen nicht kenne, fällt es mir schwer, nach dem zu suchen, wonach ich suche.

EDIT:

Nachdem er von @orestiss inspiriert und Hantieren kam ich mit diesem nach oben.

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

Damit ich alle Knoten erhalten, die um Zentrum im Zyklus sind, mit Ausnahme Zentrum selbst. Dies funktioniert auch für Grenzknoten.

+0

Dieses Konzept Sinn in einem quadratischen Gitter macht, aber vielleicht nicht für andere Graphen. Können Sie uns ein bisschen mehr darüber erzählen, warum Sie danach suchen, damit wir eine angemessene Antwort geben können? – Joel

+0

Ich arbeite mit quadratischen Gittern zur Gittergenerierung für CFD-Simulationen (sogenannte block-strukturierte Netze). Um einige Mesh-Glättungsalgorithmen (z. B. winkelbasierte Glättung) implementieren zu können, benötige ich die Referenz zu diesen Knoten. Ich habe meine eigene Datenstruktur, aber ich möchte Graphen übernehmen, da es dort bereits viele andere Funktionen gibt, die ich für meine Projekte anwenden kann. Und ich möchte mehr Wissen über Graphen bekommen :) – chiefenne

Antwort

1

Ich glaube, dass in diesem speziellen Fall würde ausreichen, um zu finden, welche Nachbarn Ihre Nachbarn gemeinsam haben.

würde der Code:

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

Das löst meine Frage. Danke für die Bereitstellung der Logiken und des Codes. So sieht es aus, es gibt keine dedizierte Funktion in NetworkX, die das tut. – chiefenne

+0

Sie sind willkommen @Andy, ich habe den Code nicht ausgeführt, so dass es einige Änderungen benötigt, um ordnungsgemäß zu funktionieren – orestiss

+0

Ich musste es geringfügig ändern. Die Zeile "if neigb in" benötigte etwas wie: "wenn G. Nachbarn (Nachbarn) in". Müssen meinen Code umgestalten, bevor ich es teile;) – chiefenne