NetworkX中合并度数为n的节点关联边的实现方法
如何在NetworkX中合并度数为指定值的节点并重构边?
我明白你想要实现的效果:移除图中所有度数为2的节点,并且把这些节点原本连接的两个邻居直接相连,相当于把这些"中间节点"去掉,拉直它们所在的路径。下面是具体的实现步骤和代码:
步骤说明
核心思路很简单:
- 先找出所有度数等于目标值(这里是2)的节点
- 对每个这样的节点,找到它的两个邻居,在邻居之间添加一条边
- 最后移除这个中间节点
需要注意的是,不能直接在遍历图节点的过程中修改图结构,所以我们要先把所有要处理的节点收集到一个列表里,再逐个处理。
完整代码实现
import networkx as nx import matplotlib.pyplot as plt # 1. 定义原始无向图 edge_list = [('1','2'),('2','3'),('3','4'),('3','5'),('1','6'),('6','7'),('6','8'),('9','8')] G = nx.Graph() G.add_edges_from(edge_list) # 2. 设置目标度数,收集需要移除的节点 target_degree = 2 nodes_to_remove = [node for node, degree in G.degree() if degree == target_degree] # 3. 逐个处理节点:连接邻居并移除节点 for node in nodes_to_remove: neighbors = list(G.neighbors(node)) # 因为目标度数是2,所以每个节点恰好有2个邻居 if len(neighbors) == 2: G.add_edge(neighbors[0], neighbors[1]) G.remove_node(node) # 4. 绘制处理后的图 nx.draw_networkx(G, with_labels=True) plt.show()
效果验证
运行这段代码后:
- 节点1(连接2和6)被移除,同时2和6会被连接;随后节点2(此时连接3和6)被移除,3和6会被连接,最终得到
3-6的边 - 节点8(连接6和9)被移除,直接得到
6-9的边 - 剩下的节点就是3、4、5、6、7、9,和你期望的结果完全一致
如果之后需要处理其他度数的节点,只需要修改target_degree的值即可(不过度数不为2时,邻居数量大于2,需要根据你的需求调整邻居之间的连接逻辑,比如全连接或者其他规则)。
内容的提问来源于stack exchange,提问作者giser_yugang
相关产品推荐
相关产品推荐

