Использование subgraph () и сохранение атрибутов вершин с помощью igraph python

Я хочу разбить отключенный граф на блоки (чтобы использовать community_spinglass). Однако как только я получаю подграф и использую community_spinglass (), метки вершины в исходном графе теряются. Я имею дело с 40+ вершинами, поэтому их нелегко отследить. Вот «игрушечный пример» моей проблемы:

import igraph
from igraph import Graph
g4_matrix = [ [0,0,-1,0,0,0,0], [0,0,0,0.8,0.2,0,0], [-1,0,0,0,0,0,0], [0,0.8,0,0,1,0,0.1], [0,0.2,0,1,0,-0.3,-.7], [0,0,0,0,-0.3,0,1], [0,0,0,0.1,-0.7,1,0] ]
v_name = ["1", "2", "3", "4", "5", "6", "7"]
g4 = Graph.Weighted_Adjacency(g4_matrix, mode = 'undirected',attr = 'weight' )
igraph.plot(g4,bbox = (300, 300),vertex_label = v_name)

Исходный график с ярлыками

После получения блоков и сообществ:

g4_blocks = g4.blocks()
g4_block = g4.vs.select(g4_blocks[1])
Block1 = g4.subgraph(g4_block)
igraph.plot(Block1, bbox = (200, 200), vertex_label = v_name)

Подграф, как было замечено, вершины следуют за списком v_name по порядку и не сохраняют предыдущую метку

Но мы видим, что вершины следуют за списком v_name по порядку, а не за их предыдущей меткой. Более того, когда мы получаем сообщества:

comm = Block1.community_spinglass()
for c in comm:
    print c

[2, 3, 4]
[0, 1]

мы получаем индекс подграфа, но его сложно соотнести с индексом исходного графа.

Есть ли способ получить сообщества, ссылающиеся на индекс или метку исходного графа?

Заранее спасибо.


person RM-    schedule 16.02.2016    source источник


Ответы (1)


Используйте Block1.vs[c]["name"], чтобы получить имена узлов в сообществе c в пределах Block1. Объяснение:

  1. Block1.vs - последовательность вершин всего Block1 графа.

  2. Block1.vs[c] подбирает эту последовательность вершин только для узлов, индексы которых находятся в итерируемом объекте с именем c, что и имеет место в вашем цикле for.

  3. Block1.vs[c]["name"] извлекает name атрибут вершины для вершин, которые вы выбрали на предыдущем шаге. Поскольку имена хранятся в подграфах, это должно позволить вам связать узлы Block1 с вашим исходным графом.

person Tamás    schedule 17.02.2016
comment
Я получаю сообщение об ошибке: «KeyError:« Атрибут не существует ». - person RM-; 18.02.2016
comment
Ах, сначала используйте g4.vs["name"] = v_name - это скопирует ваш v_name список в name атрибут вершины исходного графа. Block1 тогда сохранит имена правильно. - person Tamás; 21.02.2016