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

删除图中低度数节点时部分高度数节点被误删的原因及解决方法

问题:删除低度数节点时,为何原高度数节点的度数大幅下降甚至看似“消失”?

用户尝试删除图中度数≤50的节点以简化图,编写代码如下:

low_degree_node = [x for x in g.nodes() if g.degree(x) <= 50]
g.remove_nodes_from(low_degree_node)

但验证时发现原最大度数398的节点“不见了”,删除后最大度数变为363,用户疑惑是否误删了高度数节点,完整代码及运行结果如下:

完整测试代码

# 删除前统计度数
degree_sequence = sorted((d for n, d in g.degree()), reverse=True)
dmax = max(degree_sequence)
dmin = min(degree_sequence)
print(dmin)
print(dmax)

# 删除低度数节点
low_degree_node = [x for x in g.nodes() if g.degree(x) <= 50]
g.remove_nodes_from(low_degree_node)

# 删除后统计度数
degree_sequence = sorted((d for n, d in g.degree()), reverse=True)
dmax = max(degree_sequence)
dmin = min(degree_sequence)
print(dmin)
print(dmax)

运行结果

# 删除前
2
398
# 删除后
41
363

问题根源

你并没有误删高度数节点,核心原因是:

  • 你是基于原始图的度数筛选要删除的节点,删除这些低度数节点后,剩余高度数节点的邻居数量会减少,导致它们的度数随之下降。比如原度数398的节点,有35个邻居是度数≤50的节点,删除这些邻居后,它的度数自然降到398-35=363,这和你看到的结果完全吻合。
  • 删除后的最小度数变为41,也是同理:原本度数在5191之间的节点,因为失去了部分低度数邻居,度数降到了4150之间,但这些节点本身并没有被删除。

正确解决方案

根据你的实际需求选择对应方式:

需求1:仅删除初始度数≤50的节点

你的原代码逻辑是正确的,没有误删节点。如果要验证这一点,可以在删除前后打印节点数量:

print("删除前节点数:", len(g.nodes()))
low_degree_nodes = [x for x in g.nodes() if g.degree(x) <= 50]
g.remove_nodes_from(low_degree_nodes)
print("删除后节点数:", len(g.nodes()))

对比两个数值,差值就是初始度数≤50的节点数量,证明高度数节点并未被删除。

需求2:最终保留的所有节点度数都>50

如果你的真实目标是让图中剩余节点的度数全部大于50,那需要迭代删除——因为每次删除低度数节点后,其他节点的度数可能降到50以下,需要重复处理直到没有符合条件的节点:

while True:
    # 每次循环都基于当前图的实时度数筛选
    low_degree_nodes = [node for node in g.nodes() if g.degree(node) <= 50]
    if not low_degree_nodes:
        break  # 没有可删除的节点,终止循环
    g.remove_nodes_from(low_degree_nodes)

这种方式会持续清理所有当前度数≤50的节点,直到图中所有节点的度数都满足>50的要求。


内容的提问来源于stack exchange,提问作者yy w

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:15:33