Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在大型NetworkX图形中删除tie=1的节点_Python_Graph Theory_Networkx_Filterfunction - Fatal编程技术网

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

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

我用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_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哦,是的,当然,如果你现在有一个独立的节点列表,不管最初是如何获得的,你都可以在列表上循环时更改图形——这通常是一种较差的方法,因为需要具体化整个大列表,因此我通常更喜欢循环容器中的项: