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

如何在NetworkX图中查询指定节点的K个最近邻节点

NetworkX 带权无向图K最近邻实现方案

你提供的初始化代码有一个小笔误,nx.graph() 需要修改为首字母大写的 nx.Graph(),否则运行会报错。

NetworkX 没有内置专门返回指定节点K个最近邻的专属函数,但基于现有接口实现起来非常简单,分两种场景对应不同实现方式:

  • 场景1:仅统计直接相邻节点,按邻接边权重从小到大取K个(匹配你给出的示例需求)
    实现代码如下:
    import networkx as nx
    
    # 修正后的图初始化代码
    g = nx.Graph()
    g.add_node(0)
    g.add_node(1)
    g.add_node(2)
    g.add_node(3)
    g.add_edge(0,1,weight=2)
    g.add_edge(0,2,weight=3)
    g.add_edge(0,3,weight=4)
    g.add_edge(1,2,weight=3)
    g.add_edge(1,3,weight=5)
    g.add_edge(2,3,weight=6)
    
    def get_k_direct_neighbors(G, target_node, k, weight_key='weight'):
        # 获取目标节点所有邻接节点与对应边权重
        neighbor_weight_pairs = [(neighbor, attr[weight_key]) for neighbor, attr in G[target_node].items()]
        # 按权重升序排序后取前K个节点
        neighbor_weight_pairs.sort(key=lambda x: x[1])
        return [pair[0] for pair in neighbor_weight_pairs[:k]]
    
    # 测试调用,查询节点0的2个最近邻
    print(get_k_direct_neighbors(g, 0, 2))
    # 输出结果:[1, 2],和预期一致
    
  • 场景2:统计全局所有节点,按两点之间最短路径长度从小到大取K个(支持多跳路径的最近邻)
    可以直接复用NetworkX内置的单源最短路径接口实现,代码如下:
    def get_k_global_neighbors(G, target_node, k, weight_key='weight'):
        # 计算目标节点到所有可达节点的最短路径长度
        path_length_map = nx.single_source_dijkstra_path_length(G, target_node, weight=weight_key)
        # 排除节点自身,按路径长度升序排序后取前K个
        sorted_nodes = sorted(path_length_map.items(), key=lambda x: x[1])
        return [node for node, length in sorted_nodes if node != target_node][:k]
    
    # 测试调用,查询节点0的2个全局最近邻
    print(get_k_global_neighbors(g, 0, 2))
    # 输出结果:[1, 2]
    

内容的提问来源于stack exchange,提问作者sairam rebbapragada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:09