我用NetworkX制作了大图,大约有20,000个节点。我想删除只有一个平局(或零关系)的节点,以尝试减少混乱。由于它是一个非常大的图形,我不知道具有tie = 1或0的名称或ID的节点。
有没有人知道如何在不指定节点ID或名称的情况下删除这些节点?
迭代Graph
g
会产生g
的所有节点,一次一个 - 我相信你不能在迭代过程中改变g
,但你可以选择性地创建一个要删除的节点列表,然后将它们全部删除:
to_del = [n for n in g if g.degree(n) <= 1]
g.remove_nodes_from(to_del)
我想你是在追随这个单线:
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()
)