You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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)}.")  

对应的图结构:
Graph G plot

当前代码调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:00:24