首页 > 解决方案 > 我有一个无向 NetworkX 图,想找到 node_a 的所有邻居,它们也是 node_b 的邻居

问题描述

直截了当的问题:如何在 node_a 和 node_b 之间找到所有共同的邻居,最好的方法是什么?

我的代码是:

my_node_list_a = [ ... ]
my_node_list_b = [ ... ]

for c in my_node_list_a:
    for x in nx.neighbors(G, c):
        for y in my_node_list_b:
            for h in nx.neighbors(G, y):
                 if x in y:
                    print(x)

这是糟糕的代码。首先,我必须手动填充my_node_list_amy_node_list_b通过执行for i in G.nodes(): print(i)并且只将我想要运行循环的节点放入数组中。

编辑

标题说的是邻居,但我是 networkx 的新手,所以它可能不是正确的术语。如果邻居只表示距离为 1 的节点,那么是的,这就是我想要的。

但是,我也对哪些节点连接数组中的节点my_node_list_a以及my_node_list_b距离大于 1 感兴趣,所以如果有人能告诉我如何做到这一点,它也会很有用(基本上,向我展示路径( s) 他们之间)

进一步编辑

我需要G根据所选节点的邻居从我的主图创建一个图。

最好的方法是什么?

标签: pythonnetworkx

解决方案


要查找两个节点之间的共同邻居,您可以使用以下函数common_neighbors()

import networkx as nx

G = nx.turan_graph(6, 2)

%matplotlib inline # jupyter notebook
nx.draw(G, with_labels=True)

list(nx.common_neighbors(G, 3, 5))
# [0, 1, 2]

图形

要查找两组节点(顶点)之间的共同邻居,您可以使用以下函数node_boundary()

import networkx as nx
from itertools import chain

G = nx.grid_graph(dim=[5, 5])

list_A = [(3, i) for i in range(5)]
list_B = [(1, i) for i in range(5)]
intersec = nx.node_boundary(G, list_A) & nx.node_boundary(G, list_B)
# {(2, 1), (2, 0), (2, 3), (2, 2), (2, 4)}

color = []
for i in G.nodes():
    if i in intersec:
        col = 'green'
    elif i in chain(list_A, list_B):
        col = 'red'
    else:
        col = 'pink'
    color.append(col)

%matplotlib inline
nx.draw(G, with_labels=True, node_color=color, node_size=1000)

在此处输入图像描述


推荐阅读