如何在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
相关产品推荐
相关产品推荐

