Networkx:将MultiDiGraph转换为DiGraph时合并边权重求和
NetworkX中MultiDiGraph转DiGraph时合并边权重求和的实现方式
核心结论
NetworkX没有内置直接将MultiDiGraph转换为DiGraph并自动对同方向(u->v)边权重求和的功能——默认的DiGraph(MultiDiGraph)转换逻辑只会保留每对节点间最后添加的那条边,这也是你示例中输出为5而非期望14的原因。
手动实现方法
要实现权重求和的转换,必须通过手动遍历节点与边的方式构建新的DiGraph,以下是两种简洁的实现方式:
方法1:遍历所有边累加权重
import networkx as nx G = nx.MultiDiGraph() G.add_edge('u', 'v', weight=7) G.add_edge('u', 'v', weight=1) G.add_edge('u', 'v', weight=1) G.add_edge('u', 'v', weight=5) # 初始化空的DiGraph H = nx.DiGraph() # 遍历所有节点对及其对应的多条边 for u, v, edge_data in G.edges(data=True): # 如果u->v边已存在,累加权重;否则添加新边 if H.has_edge(u, v): H[u][v]['weight'] += edge_data['weight'] else: H.add_edge(u, v, weight=edge_data['weight']) edge_weight = H['u']['v']['weight'] print(edge_weight) # 输出14
方法2:按节点邻接关系分组求和
利用G.adj遍历每个节点的邻接关系,对每个邻接节点的所有边权重直接求和:
import networkx as nx G = nx.MultiDiGraph() G.add_edge('u', 'v', weight=7) G.add_edge('u', 'v', weight=1) G.add_edge('u', 'v', weight=1) G.add_edge('u', 'v', weight=5) H = nx.DiGraph() for u in G.nodes(): for v in G[u]: # 累加u到v的所有边权重 total_weight = sum(edge['weight'] for edge in G[u][v].values()) H.add_edge(u, v, weight=total_weight) edge_weight = H['u']['v']['weight'] print(edge_weight) # 输出14
内容的提问来源于stack exchange,提问作者Marcio Buss
相关产品推荐
相关产品推荐

