python - 将 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
所以我不明白为什么边缘的整体没有添加到图中。有人有什么想法吗?
解决方案
这是因为您的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)
推荐阅读
- makefile - Makefile 中的变量替换会产生意想不到的结果
- github - 将 FormSpree 集成到 GitHub Jekyll(返回消息:Form 应该发布)
- python - sqlalchemy concat 在 Oracle DB 上有超过 2 个元素
- google-cloud-platform - 使用不在 IAM 中的用户创建的 Google Cloud 资源
- javascript - 在 html 文件 Flutter 中使用 js 文件
- java - 复杂的 SQL 查询在数据库上需要 2 秒,但在 Java 应用程序中需要 80 秒
- c++ - 重新运行程序和字符串流?
- django - 基于 Django 分类的视图 __init__() 缺少 1 个必需的位置参数
- java - 构建 monad 时 Java 泛型的问题
- regex - 正则表达式仅使用正则表达式提取静态文本和数字