NetworkX移除边缘后恢复方法及属性分组替代方案咨询
恢复移除边缘的方法
如果已经直接删除了color='e'的边且未提前备份,无法直接恢复。正确做法是删除前先完整备份待移除边的所有属性,后续需要恢复时重新添加:
import networkx as nx # 备份color='e'的边(包含所有属性) edges_to_restore = [(u, v, attr) for u, v, attr in G.edges(data=True) if attr['color'] == 'e'] # 删除目标边 G.remove_edges_from([(u, v) for u, v, _ in edges_to_restore]) # 后续需要恢复时,重新添加边及属性 for u, v, attr in edges_to_restore: G.add_edge(u, v, **attr)
无需移除边缘的分组方案(更推荐)
完全不用修改原图,通过过滤边生成子图来实现分组,原图完整保留所有边:
# 生成不含color='e'边的子图(原图G保持不变) filtered_edges = [(u, v) for u, v, attr in G.edges(data=True) if attr['color'] != 'e'] G_filtered = G.edge_subgraph(filtered_edges) # 遍历过滤子图的连通组件,获取分组 groups = [] for comp in nx.connected_components(G_filtered): subgraph = G_filtered.subgraph(comp) asset_attrs = nx.get_edge_attributes(subgraph, "asset") groups.append({ "nodes": list(comp), "assets": asset_attrs }) # 后续处理color='e'的边直接用原图G即可 e_edges = [(u, v, attr) for u, v, attr in G.edges(data=True) if attr['color'] == 'e']
momepy相关实现思路
momepy基于NetworkX,可结合其空间网络分析工具实现需求:
import momepy # 生成过滤子图 filtered_edges = [(u, v) for u, v, attr in G.edges(data=True) if attr['color'] != 'e'] G_filtered = G.edge_subgraph(filtered_edges) # 用momepy导出组件信息(自动标记组件ID) edges_gdf = momepy.nx_to_gdf(G_filtered, edges=True) components = edges_gdf['component'].unique() # 遍历组件分组 for comp_id in components: comp_edges = edges_gdf[edges_gdf['component'] == comp_id] # 提取该组的asset属性 asset_attrs = comp_edges.set_index(['u', 'v'])['asset'].to_dict() # 处理分组逻辑
momepy更适配空间网络的形态分析,如果你是用momepy创建的空间节点/边,这种方式可无缝衔接,无需修改原图结构。
内容的提问来源于stack exchange,提问作者cyntha
相关产品推荐
相关产品推荐

