在 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])
我有一个使用 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])