Как составить график только 50-100 подключенных компонентных подграфов в NetworkX; рисование нескольких подграфов одновременно - PullRequest
0 голосов
/ 02 июля 2019

Извините, если это грубо: это мой первый пост в Stackoverflow! Я заранее извиняюсь за то, что не публикую код, но все, что я делаю, не является сложным (и, возможно, в этом проблема), поэтому описание должно работать. Я также извиняюсь, если я плохо описываю проблемы, потому что я новичок в Python; Я не совсем уверен, как воссоздать пример без данных уже: (

При использовании NetworkX я часто запускаю большие неориентированные графы (назовем их G) с тысячами узлов после импорта данных из панд. Большинство узлов VAST имеют только один или два ребра, что для меня просто шум. Меня интересуют кластеры с множеством узлов, и это на самом деле меньшинство.

Таким образом, я затем запущу команду nx.connected_components, чтобы составить длинный список всех наборов подграфов, содержащихся в G, просмотреть лучшие результаты и распечатать отдельные подграфы, которые меня интересуют, по одному за раз.

Таким образом, когда я получу свой список / словарь генератора всех подграфов подключенных компонентов (который, как правило, очень длинный), я обычно просто смотрю на первые 50-100 результатов. Потому что они, как правило, имеют то, что я ищу.

Я пытался nx.connected_component_subgraphs, но мне так много не нужно, что это почти так же плохо, как просто визуализировать всю сеть сразу.

Итак, вкратце: как я могу взять генератор / список наборов, которые nx.connected_components дает мне - которые я затем сокращаю до лучших 50 - и превратить это в новый граф?

Я попытался преобразовать вывод nx.component_components в список, но все готово.

Нет сообщений об ошибках.

1 Ответ

0 голосов
/ 02 июля 2019

Одним из подходов может быть что-то вроде следующего:

Сначала найдите все компоненты, кроме N самых больших

small_components = sorted(nx.connected_components(G), key=len)[:-N]

Затем удалите из G все вершины, принадлежащие одному из следующих компонентов:

G.remove_nodes_from(itertools.chain.from_iterable(small_components))

Вот пример, в котором мы храним только два самых больших компонента данного графа:

In [31]: G = nx.Graph()
In [32]: G.add_edges_from([(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (8, 9)])
In [33]: small_components = sorted(nx.connected_components(G), key=len)[:-2]
In [34]: small_components
Out[34]: [{5, 6}]
In [35]: G.remove_nodes_from(itertools.chain.from_iterable(small_components))
In [36]: G.nodes()
Out[36]: NodeView((1, 2, 3, 4, 7, 8, 9))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...