删除图中低度数节点时部分高度数节点被误删的原因及解决方法
问题:删除低度数节点时,为何原高度数节点的度数大幅下降甚至看似“消失”?
用户尝试删除图中度数≤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
相关产品推荐
相关产品推荐

