NetworkX - 绕过节点的路径

3
我使用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)包含该“循环”中的所有节点。由于我不知道图形术语的正确命名,因此很难搜索我要查找的内容。

编辑:

在受到@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]))

通过这个方法,我可以获取所有在中心周围循环的节点,但不包括中心本身。这对于边界节点也有效。


这个概念在正方形晶格中是有意义的,但对于其他图表可能并非如此。您能否告诉我们更多关于您为什么寻找它的原因,以便我们可以给出适当的答案? - Joel
我使用正方形格子来生成CFD模拟的网格(所谓的块状结构网格)。为了能够实现一些网格平滑算法(例如基于角度的平滑),我需要参考这些节点。我有自己的数据结构,但我想采用图形,因为那里已经有许多其他可用的函数,我可以应用于我的项目。而且我想更多地了解图形 :) - chiefenne
1个回答

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

这解决了我的问题。感谢您提供逻辑和代码。所以在我看来,NetworkX中没有专门的函数可以做到这一点。 - chiefenne
欢迎,@Andy。我还没有运行这段代码,所以可能需要一些更改才能正常运行。 - orestiss
我不得不稍作修改。这一行“if neighb in ”需要像这样写: “if G.neighbors(neighb) in ”。 在分享之前,需要对我的代码进行重构。 ;) - chiefenne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接