Выполнение объединения графов на основе имен вершин Python igraph

Эта проблема была зарегистрирована на github примерно 6 месяцев назад, но с тех пор еще не исправлено Мне интересно, есть ли быстрое исправление, которое мне не хватает.

Я хочу объединить два графика на основе их имен:

g1 = igraph.Graph()
g2 = igraph.Graph()

# add vertices
g1.add_vertices(["A","B"])
g2.add_vertices(["B","C","D"])

for vertex in g1.vs:
    print vertex.index
0
1

for vertex in g2.vs:
    print vertex.index
0
1
2

Однако, когда я выполняю объединение, igraph использует идентификаторы вершин, а не имена, поэтому я получаю три вершины вместо четырех (если бы это было основано на именах). Я предполагаю, что поскольку B имеет индекс 0 в g2, он объединяется с A из g1. И аналогичным образом C из g2 объединяется с B из g1.

g_union = igraph.Graph.union(g1,g2)

g_union.vs['name'] # of course
KeyError: 'Attribute does not exist'

for vertex in g_union.vs:
    print vertex.index
0
1
2

Любая идея о том, как обойти эту проблему? Это возможно, так как это было сделано в R-реализации igraph.


person Antoine    schedule 03.02.2016    source источник
comment
Объединение по имени еще не поддерживается в igraph (если вы не хотите кодировать его самостоятельно). Само ядро ​​C не поддерживает объединения на основе атрибутов вершин. Версия R поддерживает его, потому что кто-то написал для него функцию на чистом R. К сожалению, в последнее время у меня очень мало времени, чтобы посвятить igraph, поэтому я боюсь, что вам придется самостоятельно придумывать аналогичную функцию на Python.   -  person Tamás    schedule 04.02.2016
comment
@ Тамас, спасибо за откровенный ответ. Я постараюсь посмотреть, смогу ли я воспроизвести функцию R в Python, и держать вас в курсе, если все будет хорошо.   -  person Antoine    schedule 05.02.2016
comment
@Tamás Я не могу найти ту функцию R, о которой вы говорите, на github. Не будете ли вы так любезны указать мне на него? Спасибо за ваше время   -  person Antoine    schedule 08.02.2016
comment
Все операторы графа в R-igraph (объединение, пересечение и т. д.) находятся здесь: github.com/igraph/rigraph/blob/dev/R/operators.R . Они выполняют операцию, используя имена вершин (вместо идентификаторов), если @byname=TRUE@.   -  person Tamás    schedule 08.02.2016
comment
@Tamás Спасибо, я знал это, проблема в том, что я не могу получить исходный код R. Когда я набираю getAnywhere(union.igraph), я получаю только A single object matching ‘union.igraph’ was found It was found in the following places registered S3 method for union from namespace igraph namespace:igraph with value function (..., byname = "auto") { .igraph.graph.union.or.intersection("R_igraph_union", ..., byname = byname, keep.all.vertices = TRUE) } <environment: namespace:igraph>   -  person Antoine    schedule 08.02.2016


Ответы (1)


Просто создайте новый граф и добавьте вершины по имени. Конечно, это устранило бы другие свойства узла, которые вам также пришлось бы добавлять вручную.

g1 = igraph.Graph()
g2 = igraph.Graph()

# add vertices
g1.add_vertices(["A","B"])
g2.add_vertices(["B","C","D"])

g3 = igraph.Graph()
verts_to_add = []
for v in g1.vs:
    if v['name'] not in verts_to_add:
        verts_to_add.append(v['name'])
for v in g2.vs:
    if v['name'] not in verts_to_add:
        verts_to_add.append(v['name'])

g3.add_vertices(verts_to_add)

for v in g3.vs:
    print(v['name'])

#A
#B
#C
#D
person Niklas Braun    schedule 23.05.2017