如何在NetworkX中删除中间节点并合并其相邻边为一条边?
NetworkX 合并相邻边并删除中间节点的实现方法
NetworkX 没有专门的单一API直接完成“删除中间节点并合并其相邻边”的操作,但可以通过组合现有方法轻松实现,以下是具体步骤和示例:
无向图场景
基础步骤
- 获取待删除节点(比如b)的所有邻居节点
- 在这些邻居节点之间添加新边
- 删除中间节点b
示例代码
import networkx as nx # 创建初始无向图 G = nx.Graph() G.add_edges_from([("a", "b"), ("b", "c")]) # 获取节点b的邻居 neighbors = list(G.neighbors("b")) # 邻居间添加新边 if len(neighbors) == 2: G.add_edge(neighbors[0], neighbors[1]) # 删除节点b G.remove_node("b") # 验证结果 print(list(G.edges())) # 输出: [('a', 'c')]
带属性边的处理
如果边带有权重等属性,需要合并属性的话,可以先提取原有边的属性再处理:
import networkx as nx G = nx.Graph() G.add_edge("a", "b", weight=2) G.add_edge("b", "c", weight=3) # 获取属性并合并 weight_ab = G.edges["a", "b"]["weight"] weight_bc = G.edges["b", "c"]["weight"] G.add_edge("a", "c", weight=weight_ab + weight_bc) G.remove_node("b") print(G.edges["a", "c"]["weight"]) # 输出: 5
有向图场景
如果是有向图,需要区分节点的前驱和后继节点,比如a→b和b→c要合并为a→c:
import networkx as nx G = nx.DiGraph() G.add_edges_from([("a", "b"), ("b", "c")]) # 获取前驱(指向b的节点)和后继(b指向的节点) predecessors = list(G.predecessors("b")) successors = list(G.successors("b")) # 前驱到后继添加边 for pred in predecessors: for succ in successors: G.add_edge(pred, succ) G.remove_node("b") print(list(G.edges())) # 输出: [('a', 'c')]
内容的提问来源于stack exchange,提问作者zjffdu
相关产品推荐
相关产品推荐

