首页 > 解决方案 > 将 add_edges_from 与 networkx-python 一起使用时缺少边缘

问题描述

我有一个dict带有两个元组格式的边缘以及我想添加到 networkx 的值graph

mydict看起来像下面打印的内容:

#print(mydict)
{('StopPoint:59:3786294', 'StopPoint:59:3730342'): {'time_tc': 120.0},
 ('StopPoint:59:3730342', 'StopPoint:59:4255013'): {'time_tc': 60.0},
 ('StopPoint:59:4255013', 'StopPoint:59:3786297'): {'time_tc': 120.0},
 ('StopPoint:59:3786297', 'StopPoint:59:3786298'): {'time_tc': 180.0},
 ('StopPoint:59:3786298', 'StopPoint:59:3786299'): {'time_tc': 60.0}, ...}

#len(mydict) = 233116

我注意到使用G.add_edges_from(mydict)( len(G.edges)= 123976) 后我丢失了近 100 000 条边。当我绘制时也很明显,G因为许多节点没有与边缘链接在一起。贝娄是G.edges这样的:

#print(G.edges)
{('StopPoint:93:1184', 'StopPoint:93:1260'): {'time_tc': 180.0},
 ('StopPoint:93:1184', 'StopPoint:55:79'): {'time_map': 126},
 ('StopPoint:93:1184', 'StopPoint:55:80'): {'time_map': 126},
 ('StopPoint:93:1184', 'StopPoint:8711610:800:P'): {'time_map': 336},
 ('StopPoint:93:1184', 'StopPoint:93:1183'): {'time_map': 252}}, ...}

#len(G.edges) = 123976

不应该有任何重复,mydict所以我不明白为什么边缘的整体没有添加到图中。有人有什么想法吗?

标签: pythonnetworkx

解决方案


这是因为您的mydict变量同时包含(x,y)(y,x)。如果您构建 a networkx.Graph(而不是 a networkx.DiGraph),(x,y)则被认为与 相同(y,x)。例子:

import networkx as nx
mydict = {(3,4): 5, (4,3): 6, (1,2): 6}
g = nx.Graph()
di_g = nx.DiGraph()
g.add_edges_from(mydict)
di_g.add_edges_from(mydict)
print(g.edges) # [(3, 4), (1, 2)]
print(di_g.edges) # [(3, 4), (4, 3), (1, 2)]

您可以从中构建DiGraph或删除双打mydict(这实际上取决于您的特定需求)。要从中提取所有双打,mydict只需执行以下操作:

doubles = set(frozenset(k) for k in mydict if (k[1], k[0]) in mydict)


推荐阅读