Networkx:如何拆分无向图节点并保留属性以断开边连接?
NetworkX 无向图节点拆分实操实现
实现逻辑
- 提前梳理待拆分节点的所有邻接边,按照需要断开的连通关系把邻边分成两组
- 在删除原节点前,完整复制它的全部节点属性,作为两个新节点的属性模板
- 移除原节点,所有关联到该节点的边会随节点删除自动清理
- 创建两个继承了全量原属性的新节点,分别把两组邻边重新关联到对应的新节点上,直接断开两组边之间的连通路径
可直接复用的函数实现
import networkx as nx def split_graph_node(G: nx.Graph, target_node, group_a_neighbors, group_b_neighbors): # 先提取原节点的所有属性,避免节点删除后属性丢失 origin_attrs = G.nodes[target_node].copy() # 移除原节点及所有关联边 G.remove_node(target_node) # 生成两个带全量原属性的拆分节点,节点ID可根据业务规则自定义 node1 = f"{target_node}_part1" node2 = f"{target_node}_part2" G.add_node(node1, **origin_attrs) G.add_node(node2, **origin_attrs) # 重新绑定两组邻边,形成两个独立的连通分支 for nbr in group_a_neighbors: G.add_edge(node1, nbr) for nbr in group_b_neighbors: G.add_edge(node2, nbr) return G
匹配示例拓扑的使用方式
针对给出的拆分示例,原拓扑中待拆分的目标节点是中间位置的连接节点,邻点包含左侧分支节点、上下死端连接点、右侧分支节点:
- 传入
group_a_neighbors = [左侧分支连通点, 上方死端连接点, 下方死端连接点] - 传入
group_b_neighbors = [右侧分支连通点]
执行后原图会从单连通状态拆分为两个互不连通的子图,两个新节点会完整继承原节点的所有属性,和示例展示的拆分效果完全一致。
实操注意事项
- 必须在删除原节点前完成属性提取:NetworkX的节点属性与节点实体强绑定,节点删除后属性会被同步清除,提前提取是保证属性完整保留的关键
- 邻边分组可完全按照业务需求自定义,无需受固定拓扑限制,只要邻边被分到不同组,原节点作为连通中介的作用就会被完全切断
- 拆分后的节点ID可根据场景调整,无需使用代码中的默认拼接格式,只要保证两个新节点ID唯一即可
内容的提问来源于stack exchange,提问作者Bernardo Trindade
相关产品推荐
相关产品推荐

