2015-03-25 4 views
1

Я сделал большой график с NetworkX с около 20 000 узлов. Я хотел бы удалить узлы только с одним галстуком (или с нулевыми галсами), чтобы попытаться уменьшить беспорядок. Поскольку это очень большой график, я не знаю узлов по имени или идентификатору, которые имеют tie = 1 или 0.Удаление узлов с привязкой = 1 на большом экране NetworkX

Кто-нибудь знает, как удалить эти узлы, не указав идентификатор или имя узла?

enter image description here

+0

Вас беспокоит, могут ли теперь оставшиеся узлы после удаления иметь степень 0 или 1? – Joel

+0

Другой вопрос: хотите ли вы фактически удалить их из сети или просто не включать их в чертеж? – Joel

ответ

3

Итерация на Graphg дает все узлы g «s, один в то время, - я полагаю, вы не можете изменить g во время самой итерации, но вы можете выборочно сделать список узлов необходимо удалить, а затем удалить их все:

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

Всего 2 примечания: 1) после этого удаления узлы, которые изначально имели степень 2 или выше, теперь могут иметь степень 0 или 1. Независимо от того, является ли это проблемой, зависит от целей OP. 2) вы можете изменить 'g' как часть цикла for с помощью' g.remove_node (node) ', но это может привести к удалению большего количества узлов, поскольку некоторые из них уменьшают их степень в процессе. Повторное прохождение и удаление всех таких узлов приводит к 2-ядерному графику. – Joel

+0

@Joel, wrt (1), определенно - если OP ищет 2-ядерный, то метод 'k_core', без сомнения, лучший подход; это просто не то, что я получил от Q, но это довольно неоднозначно, что вы вполне можете быть правы. Re (2), я не был уверен, разрешено ли вам изменять самый граф, который вы зацикливаете, - в более общем случае контейнеров Python вы не, но, возможно, вы правы, что 'networkx' выбирает исключение из этого (я не могу видеть, что он документирован где-нибудь, хотя - любой URL об этом?). –

+0

(1) - не был направлен на вас, а скорее на то, что OP или какой-либо другой пользователь смотрели на это. (2) да и нет - вы можете прокручивать через 'G.nodes()', который является просто списком узлов. Если вы зацикливаете «G.nodes_iter()» или 'for n in G' (который, как мне кажется, просто отображается непосредственно на' для n в G.nodes_iter() '], он не сработает. – Joel

1

Я думаю, что вы после этого однострочника:

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

Вы должны знать, что если вы удалите некоторые узлы, у вас появятся новые узлы, степень которых равна 1 или 0. Если вы хотите повторить этот процесс до тех пор, пока такие узлы не будут существовать, вы генерируете «k -коре "с k = 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-ядерного я, описанного выше, и другой результат от A Martelli, так как некоторые из более поздних узлов в списке могут первоначально иметь степень 2, но быть уменьшены до 1, прежде чем вы их достигнете. И это не будет столь же чист, потому что он создает список G.nodes(), а не с помощью более хороший итератора (если вы не изменяя график в цикле, обычно лучше перебрать узлы с G.nodes_iter(), а не G.nodes())

+0

спасибо, предложения хорошо работали – dbmehri