我有一个使用 Netwrokx 创建的随机图,我想删除度数小于 2 的节点,除了 2 个用户定义的度数 = 1 的节点。要删除度数 < 2 的所有节点,我可以使用 Networkx 的 k-core
。但我不知道如何保留这两个用户定义的节点。例如,以下代码生成,
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()
图1:
图2:
我想征求有关如何保留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 且不在 retain_node_ids
中的节点。列表。
编辑: 您可以添加两个假节点,连接节点以保留它们,计算 k 核,然后删除它们:
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])
关于python-3.x - 在 Networkx 中使用 k-core 时保留特定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62856781/