在大型NetworkX图中删除tie = 1的节点

问题描述 投票:1回答:2

我用NetworkX制作了大图,大约有20,000个节点。我想删除只有一个平局(或零关系)的节点,以尝试减少混乱。由于它是一个非常大的图形,我不知道具有tie = 1或0的名称或ID的节点。

有没有人知道如何在不指定节点ID或名称的情况下删除这些节点?

python graph-theory networkx filterfunction
2个回答
3
投票

迭代Graph g会产生g的所有节点,一次一个 - 我相信你不能在迭代过程中改变g,但你可以选择性地创建一个要删除的节点列表,然后将它们全部删除:

to_del = [n for n in g if g.degree(n) <= 1]
g.remove_nodes_from(to_del)

2
投票

我想你是在追随这个单线:

G= nx.k_core(G,k=2)

您应该知道,如果删除某些节点,您将拥有度数仅为1或0的新节点。如果您想重复此过程直到不存在此类节点,那么您将使用k生成“k-core” = 2。那就是你正在生成所有节点都具有至少2度的最大网络。这是一个内置函数:

import networkx as nx
G = nx.fast_gnp_random_graph(10000,0.0004) #erdos renyi graph, average degree = 4
G = nx.k_core(G,k=2)

最后,你可以这样做:

for node in G.nodes():
    if G.degree(node)<2:
        G.remove_node(node)

但这会产生与上面描述的2核I不同的结果,以及与A Martelli不同的结果,因为列表中的某些后续节点最初可能具有2级但在到达之前会减少到1。并且它不会那么干净,因为它创建列表G.nodes()而不是使用更好的迭代器(如果你在networkx v1.x中并且你没有改变循环中的图形,通常更好的循环节点与G.nodes_iter()而不是G.nodes()

© www.soinside.com 2019 - 2024. All rights reserved.