You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:46:14