NetworkX:如何反转 MultiDiGraph 中的有向边?
NetworkX: How to reverse a directed edge in a MultiDiGraph?
问题:如何在 Networkx MultiDiGraph 中反转边(即反转边的节点)?
Context:我有一个表示配水管网的图表,我正在尝试寻找流动回路(水离开一个点并到达相同的点,例如在泵中循环抽水)。为此,我有网络的定向 MultiDiGraph 表示(u、v、名称)和边名称的流列表,并试图通过翻转对应于管道的边来确保边的方向与流的方向相对应负流量。
但是,我找不到一种直接的方法来根据边的属性(即通过边的流)来反转边的节点。关于如何做到这一点或完成我想要做的事情的更聪明的方法有什么想法吗?
我读过 this post,它建议删除并重新添加具有相同属性但反转节点的边,但我无法使其与 MultiDiGraph 一起使用。谢谢
NetworkX API 不包含反转单个边的功能。删除有向边然后添加反向边的方法将适用于 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, node1, 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, 1, {'weight': 0.5, 'color': 'blue'}), (3, 4, {'weight': 1.0, 'color': 'red'})]
问题:如何在 Networkx MultiDiGraph 中反转边(即反转边的节点)?
Context:我有一个表示配水管网的图表,我正在尝试寻找流动回路(水离开一个点并到达相同的点,例如在泵中循环抽水)。为此,我有网络的定向 MultiDiGraph 表示(u、v、名称)和边名称的流列表,并试图通过翻转对应于管道的边来确保边的方向与流的方向相对应负流量。
但是,我找不到一种直接的方法来根据边的属性(即通过边的流)来反转边的节点。关于如何做到这一点或完成我想要做的事情的更聪明的方法有什么想法吗?
我读过 this post,它建议删除并重新添加具有相同属性但反转节点的边,但我无法使其与 MultiDiGraph 一起使用。谢谢
NetworkX API 不包含反转单个边的功能。删除有向边然后添加反向边的方法将适用于 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, node1, 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, 1, {'weight': 0.5, 'color': 'blue'}), (3, 4, {'weight': 1.0, 'color': 'red'})]