Python 在大型NetworkX图形中删除tie=1的节点
我用NetworkX制作了一个大约20000个节点的大型图。我想删除只有一个tie(或零tie)的节点,以减少混乱。因为这是一个非常大的图,我不知道tie=1或0的节点的名称或ID 有人知道如何在不指定节点ID或名称的情况下删除这些节点吗Python 在大型NetworkX图形中删除tie=1的节点,python,graph-theory,networkx,filterfunction,Python,Graph Theory,Networkx,Filterfunction,我用NetworkX制作了一个大约20000个节点的大型图。我想删除只有一个tie(或零tie)的节点,以减少混乱。因为这是一个非常大的图,我不知道tie=1或0的节点的名称或ID 有人知道如何在不指定节点ID或名称的情况下删除这些节点吗 在图形上迭代g会产生g的所有节点,一次一个——我相信您不能在迭代过程中更改g,但您可以有选择地列出要删除的节点,然后将它们全部删除: to_del = [n for n in g if g.degree(n) <= 1] g.remove_nodes_f
在
图形上迭代g
会产生g
的所有节点,一次一个——我相信您不能在迭代过程中更改g
,但您可以有选择地列出要删除的节点,然后将它们全部删除:
to_del = [n for n in g if g.degree(n) <= 1]
g.remove_nodes_from(to_del)
to_del=[n代表n如果g.degree(n)在图上迭代产生所有g
的节点,一次一个——我相信你不能在迭代过程中改变g
,但你可以有选择地列出要删除的节点,然后将它们全部删除:
to_del = [n for n in g if g.degree(n) <= 1]
g.remove_nodes_from(to_del)
to_del=[n代表n,如果g.degree(n)我想你在追求这一条线:
G= nx.k_core(G,k=2)
您应该注意,如果删除一些节点,您将拥有阶数仅为1或0的新节点。如果要重复此过程直到不存在此类节点,您将生成k=2的“k-core”。也就是说,您将生成所有节点阶数至少为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)
G.nodes()中节点的:
如果G.degree(node)我想你在追求这一条线:
G= nx.k_core(G,k=2)
您应该注意,如果删除一些节点,您将拥有阶数仅为1或0的新节点。如果要重复此过程直到不存在此类节点,您将生成k=2的“k-core”。也就是说,您将生成所有节点阶数至少为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)
G.nodes()中节点的:
如果G.degree(节点)您是否关心删除后剩余的节点现在的阶数是0还是1?另一个问题:您是否希望从网络中实际删除它们,或者只是不将它们包含在图形中?您是否关心删除后剩余的节点现在的阶数是0还是1?另一个问题:您是否希望实际删除它们来自网络,或者只是不包括在绘图中?仅2个注释:1)删除后,最初具有2级或更高级别的节点现在可以具有0级或1级。这是否是一个问题取决于OP的目标。2)您可以使用g将g
更改为for循环的一部分。删除\u节点(节点)
,但这可能会导致更多节点被删除,因为某些节点的度数会因该过程而降低。反复检查并删除所有此类节点会导致图形的2核。@Joel,wrt(1),当然——如果OP在寻找双核,那么k_-core
方法无疑是一个更好的方法;这不是我从Q中得到的,但它的模糊性足以让你完全正确。Re(2),我不确定是否允许您更改正在循环的图形——在Python容器的更一般情况下,您是不允许的,但也许您是对的,networkx
选择作为例外(尽管我在任何地方都看不到它的文档——有关于它的URL吗?)-不一定是针对您的,而是为了防止OP或其他用户看到这一点。(2)是和否-您可以循环通过G.nodes()
,这只是一个节点列表。如果您循环通过G.nodes\u iter()
或for n in G
[我认为这直接映射到for n in G.nodes\u iter())
]它会失败。@Joel哦,是的,当然,如果你现在有一个独立的节点列表,不管最初是如何获得的,你都可以在列表上循环时更改图形——这通常是一种较差的方法,因为需要具体化整个大列表,因此我通常更喜欢对容器中的项循环,而不能更改de>container
在该特定循环中!-)我要澄清的是,我最初提出(2)时最关心的问题如果有人同时尝试循环和删除,他们几乎肯定得不到他们想要的。它会删除原来是2度的节点。注意:1)删除后,原来是2度或更高的节点现在可能是0度或1度。这是否是一个问题取决于OP的目标。2)您可以将g
更改为使用g的for循环的一部分。删除节点(node)
,但最终可能会删除更多节点,因为某些节点的度数会因该过程而减少。重复执行并删除所有此类节点会导致图的2核。@Joel,wrt(1),当然——如果OP在寻找双核,那么k_-core
方法无疑是一个更好的方法;这不是我从Q中得到的,但它的模糊性足以让你完全正确。Re(2),我不确定是否允许您更改正在循环的图形——在Python容器的更一般情况下,您是不允许的,但也许您是对的,networkx
选择作为例外(尽管我在任何地方都看不到它的文档——有关于它的URL吗?)-不一定是针对您的,而是为了防止OP或其他用户看到这一点。(2)是和否-您可以循环通过G.nodes()
,这只是一个节点列表。如果您循环通过G.nodes\u iter()
或for n in G
[我认为这直接映射到for n in G.nodes\u iter())
]它将失败。@Joel哦,是的,当然,如果你现在有一个独立的节点列表,不管最初是如何获得的,你都可以在列表上循环时更改图形——这通常是一种较差的方法,因为需要具体化整个大列表,因此我通常更喜欢循环容器中的项: