python-3.x - 在 Networkx 中使用 k-core 时保留特定节点

标签 python-3.x graph networkx

我有一个使用 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:

enter image description here

图2:

enter image description here

我想征求有关如何保留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])

Figure 1 Figure 2

关于python-3.x - 在 Networkx 中使用 k-core 时保留特定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62856781/

相关文章:

python-3.x - 如何使用pandas生成一个月间隔1秒的时间序列数据?

algorithm - 精确图算法

algorithm - 基于相邻节点计算节点值的图形算法

python - 绘制具有弯曲边的拓扑有序图

python - 为什么会出现 AttributeError : module 'networkx' has no attribute 'average_neighbor_in_degree' ?

python - NetworkX 访问具有多个节点属性的节点

python - 如何以相反的顺序循环列表并跳过最后一个元素

python - 带超时的异步子进程

python - Python 多个父类上的 Super()__init__

algorithm - 小度有向无环图中的最短路径