NetworkX:如何反转MultiDiGraph中的有向边?

问题描述

问题 :如何在Networkx MultiDiGraph中反转边缘(即反转边缘的节点)?

上下文 :我有一个表示水分配网络的图形,正在尝试寻找水流回路(水离开一个点并到达同一点,例如泵在圈子里抽)。为此,我具有网络(u,v,名称)的定向MultiDiGraph表示形式和按边名称命名的流列表,并通过翻转与管道相对应的边来尝试确保边的方向与流的方向相对应流量为负。

但是,我找不到基于其属性(即通过边缘的流)来反转边缘节点的直接方法。关于如何执行此操作或以更聪明的方式完成我要尝试的操作的任何想法?

我已经读过this帖子,该帖子建议删除并重新添加具有相同属性但反向节点的边,但是我无法使其与MultiDiGraph一起使用。谢谢。

解决方法

NetworkX API不包含反转单个边缘的功能。删除有向边然后添加反向边的方法将与MultiDiGraph一起使用,如下所示。

反转MultiDiGraph中的有向边

from copy import deepcopy
import networkx as nx


def reverse_edge(graph,node1,node2):
    for key,data in graph.get_edge_data(node1,node2).items():
        graph.add_edge(node2,key=key,**(deepcopy(data)))
    graph.remove_edge(node1,node2)


G = nx.MultiDiGraph()
G.add_edge(1,2,weight=0.5,color='blue')
G.add_edge(3,4,weight=1.0,color='red')
reverse_edge(G,1,2)

print(G.edges(data=True))

输出

[(2,{'weight': 0.5,'color': 'blue'}),(3,{'weight': 1.0,'color': 'red'})]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...