如何在NetworkX Multigraph中通过求和符号权重合并边?
解决NetworkX中带符号权重多重边的合并问题
问题场景
将自研算法从MATLAB迁移至Python时,使用NetworkX处理带符号权重的多重边合并需求:
示例代码:
import networkx as nx import sympy as sym import itertools x, y, z = sym.symbols('x y z') edges = [('a', 'b', x), ('a', 'b', y), ('b','c', z)] G = nx.MultiGraph() G.add_weighted_edges_from(edges)
期望合并后输出:
combined_edges = [('a', 'b', x + y), ('b','c', z)]
NetworkX官方教程中多重图转普通图的方法取权重最小值,无法适配符号权重;自行编写的代码仅能提取每组边的第一个元素,无法实现权重求和:
unique_edges = [next(g) for _, g in itertools.groupby(edges, key=lambda x:(x[0],x[1]))]
输出结果:[('a', 'b', x), ('b', 'c', z)]
解决方案
方法1:基于itertools.groupby的权重累加
利用itertools.groupby分组后,对每组内的边权重求和。注意需先对边列表按节点对排序,确保分组正确:
import itertools import sympy as sym x, y, z = sym.symbols('x y z') edges = [('a', 'b', x), ('a', 'b', y), ('b','c', z)] # 按节点对排序,保证groupby能正确分组 sorted_edges = sorted(edges, key=lambda x: (x[0], x[1])) combined_edges = [] for node_pair, edge_group in itertools.groupby(sorted_edges, key=lambda x: (x[0], x[1])): # 累加当前节点对所有边的权重 total_weight = sum(edge[2] for edge in edge_group) combined_edges.append((node_pair[0], node_pair[1], total_weight)) print(combined_edges)
运行输出:
[('a', 'b', x + y), ('b', 'c', z)]
方法2:基于NetworkX MultiGraph直接处理
直接遍历MultiGraph中的唯一节点对,累加对应所有边的权重,无需提前排序:
import networkx as nx import sympy as sym x, y, z = sym.symbols('x y z') edges = [('a', 'b', x), ('a', 'b', y), ('b','c', z)] G = nx.MultiGraph() G.add_weighted_edges_from(edges) combined_edges = [] # 遍历所有唯一节点对 for u, v in G.edges(): # 累加当前节点对所有边的权重 total_weight = sum(data['weight'] for _, _, data in G.edges(u, v, data=True)) combined_edges.append((u, v, total_weight)) print(combined_edges)
输出结果与期望一致。
内容的提问来源于stack exchange,提问作者Gaz W
相关产品推荐
相关产品推荐

