如何修改NetworkX代码以仅获取节点的二阶邻居?
获取NetworkX图中节点的仅二阶邻居
问题背景
以下是构建的NetworkX图及获取二阶邻居的初始代码:
import networkx as nx G = nx.Graph() G.add_edge('1','2',weight=673) G.add_edge('2','4',weight=201) G.add_edge('4','1',weight=20) G.add_edge('2','3',weight=96) G.add_edge('3','4',weight=44) G.add_edge('6','3',weight=7) G.add_edge('6','4',weight=96) G.add_edge('5','6',weight=10) G.add_edge('7','6',weight=10) G.add_edge('8','6',weight=10) def neighbors_r2(node): subgraph = nx.ego_graph(G,str(int(node)),center=False,radius=2) return list(subgraph.nodes()) print(f"second order neighbors are: {neighbors_r2(6)}.")
对应的图结构:
当前代码调用neighbors_r2(6)返回['1', '2', '4', '3', '5', '7', '8'],但实际需要仅返回二阶邻居(距离目标节点恰好为2的节点),即['1', '2', '3', '4']。原因是nx.ego_graph会包含所有距离≤radius的节点,其中包含了一阶邻居(5、7、8)。
解决方案
可以通过两种方式修改函数,仅保留距离目标节点恰好为2的节点:
方法一:基于最短路径长度筛选
直接计算所有节点到目标节点的最短路径距离,筛选出距离等于2的节点:
def neighbors_r2(node): target = str(int(node)) # 计算每个节点到目标节点的最短路径长度 node_distances = nx.shortest_path_length(G, target) # 筛选距离恰好为2的节点 return [node for node, distance in node_distances.items() if distance == 2]
方法二:集合运算推导
通过一阶邻居的邻居集合,减去一阶邻居和自身,得到二阶邻居:
def neighbors_r2(node): target = str(int(node)) # 获取目标节点的一阶邻居集合 first_order = set(G.neighbors(target)) # 获取所有一阶邻居的邻居集合 first_neighbors_neighbors = set() for neighbor in first_order: first_neighbors_neighbors.update(G.neighbors(neighbor)) # 二阶邻居 = 一阶邻居的邻居 - 一阶邻居 - 自身 second_order = first_neighbors_neighbors - first_order - {target} return list(second_order)
调用修改后的neighbors_r2(6),会返回符合预期的二阶邻居列表(列表顺序可能因集合特性略有不同,若需要固定顺序可添加sorted()处理)。
内容的提问来源于stack exchange,提问作者Math Universe
相关产品推荐
相关产品推荐

