首页 > 解决方案 > Networkx:在 MultiDiGraph 上调用时,get_edge_data 返回意外结果

问题描述

我正在使用 Python 流行的网络库networkx。从下面的代码中,我希望打印的语句是等效的。

import networkx as nx

graph = nx.Graph()
mgraph =  nx.MultiDiGraph()

for G in [graph, mgraph]:
    G.add_edge(1, 2, weight=4.7)

print(graph.get_edge_data(1, 2))
print(mgraph.get_edge_data(1,2))

但是我得到以下信息:

{'weight': 4.7}
{0: {'weight': 4.7}}

为什么0在多向图的情况下要添加额外的键?它对应什么?

标签: pythonnetworkx

解决方案


AMultiDiGraph允许多个边。每条边都可能有自己的属性。在您的示例中,它告诉您的是,在这种Graph情况下,边缘(只能有一个)的重量为 4.7。但在这种MultiDiGraph情况下,它告诉您索引为 0 的边(并且恰好只有这条边)的权重为 4.7。

试试这个以获得更清晰的位置,我们再次添加边缘,但权重不同:

import networkx as nx

graph = nx.Graph()
mgraph =  nx.MultiDiGraph()

for G in [graph, mgraph]:
    G.add_edge(1, 2, weight=4.7)
    G.add_edge(1, 2, weight = 5)  #are we overwriting an edge, or adding an extra edge?

print(graph.get_edge_data(1, 2))
print(mgraph.get_edge_data(1,2))

这给出了输出

>{'weight': 5}
>{0: {'weight': 4.7}, 1: {'weight': 5}}

表明在这种Graph情况下,边缘属性被覆盖(因为只有一条边),但在这种MultiDiGraph情况下,第二条边添加了 index 1


推荐阅读