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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:34:53