在 Networkx 中使用 k-core 时保留特定节点

Retaining specific nodes while using k-core in Networkx

我有一个使用 Netwrokx 创建的随机图,我想删除度数小于 2 的节点,但度数 = 1 的 2 个用户定义节点除外。要删除度数 < 2 的所有节点,我可以使用Networkx 的 k-core。但我不确定如何保留 2 个用户定义的节点。例如,下面的代码生成,

import networkx as nx
import matplotlib.pyplot as plt

# fig 1
G = nx.gnm_random_graph(n=20, m=30, seed=1)
nx.draw(G, with_labels=True, pos=nx.spring_layout(G))
plt.show()

G = nx.k_core(G, k=2)
nx.draw(G, with_labels=True, pos=nx.spring_layout(G))
plt.show()

图一:

图二:

请教如何保留2个自定义节点: 例如

retain_node_ids = [1,2]

编辑:

我可以按照下面的建议使用 remove_nodes_from。但是如果我们删除度 < 2 的节点,我们最终可能会得到新的节点,这些节点最初的度数 >=2,但度数 <2。要重复该过程,直到找不到度数 < 2 的节点,已使用 k-core

以下是您的操作方法:

degrees = nx.classes.degree(G)
G.remove_nodes_from([node
                     for node in G.nodes
                     if node not in retain_node_ids and degrees[node] <= 2])

当然这段代码并没有找到最大子图(像k_core函数那样):它只是简单地删除所有度数小于或等于2且不在[=中的节点13=]列表。


编辑: 您可以添加两个假节点,连接节点以保留它们,计算 k-core 然后摆脱它们:

G.add_edges_from([(u, v) for u in retain_node_ids for v in (n, n+1)])
G = nx.k_core(G, k=2)
G.remove_nodes_from([n, n+1])