NetworkX保留边移除无关节点失败及路网精简需求咨询
问题描述
我正在使用NetworkX的shortest_path函数计算最短出行距离。但由于使用大洛杉矶地区的完整路网(样本中的个体可能从河滨县前往洛杉矶县),我的G文件大小接近15GB。我希望缩小G文件的大小以进行多进程处理。我知道NetworkX有多种简化图的方法,但因项目对出行距离精度要求较高,我不愿采用这些方法,若您知晓不影响精度的图简化方式,恳请告知。
另外,我打算移除G中除样本起讫点对(OD点)之外的所有节点,同时保留所有边(因我需要边的距离信息),想了解这样是否仍能正常使用shortest_path函数。我尝试了以下代码:
G.remove_nodes_from(list(G.nodes))
我原本以为这会仅移除所有节点而保留边,但实际却同时删除了所有节点和边。
解决方案
一、不影响精度的图简化方法
- 提取OD点的最小连通子图:这是最有效的无精度损失简化方式。最短路径必然存在于连接所有OD点的连通子图中,因此只需保留这个子图即可大幅压缩规模:
- 收集所有样本的起点和终点,存入集合
od_nodes; - 提取包含所有
od_nodes的连通分量(若原路网不连通,需确保所有OD点在同一分量,否则分分量处理); - 生成子图:
od_nodes = {起点1, 终点1, 起点2, 终点2, ...} # 取任意一个OD点找到对应的连通分量 connected_component = nx.node_connected_component(G, next(iter(od_nodes))) subG = G.subgraph(connected_component).copy()
- 收集所有样本的起点和终点,存入集合
- 删除孤立节点:直接移除所有无连接边的孤立节点,这类节点对路径计算无任何影响,可通过以下代码实现:
isolated_nodes = [n for n in G.nodes if G.degree(n) == 0] G.remove_nodes_from(isolated_nodes) - 合并完全重复的边:若两个节点间存在多条边且距离属性完全一致,可合并为单条边(不影响最短路径选择)。可手动遍历处理或使用
nx.contracted_edges,但需严格确认边的距离属性完全相同。
二、关于OD点与边的保留操作
NetworkX中边依附于节点存在,删除节点时相关边会被自动删除,因此你之前的代码会同时清空节点和边,这是正常行为。
若要保留OD点并确保能计算最短路径,需注意:
- 如果OD点间的最短路径需要经过中间节点,必须保留这些中间节点,否则
shortest_path无法找到有效路径。此时应采用上述提取最小连通子图的方法。 - 若仅需保留OD点的直接邻边(仅适用于OD点直接连通的场景),可通过以下代码构建新图:
但这种方式会丢失中间节点,无法计算需要中转的最短路径,仅在特定场景下适用。od_nodes = {起点1, 终点1, ...} # 筛选至少一个端点在OD集合中的边 edges_to_keep = [(u, v, attr) for u, v, attr in G.edges(data=True) if u in od_nodes or v in od_nodes] newG = nx.DiGraph() # 根据原图图类型选择,如Graph/DiGraph newG.add_edges_from(edges_to_keep)
内容的提问来源于stack exchange,提问作者Z. G.
相关产品推荐
相关产品推荐

