2014-01-23 1 views
2

Для данного графа g Я хотел бы изменить свойство, скажем 'color', для данного отдельного края, что может быть сделано как этотВыберите отдельные ребра на источник-кортежа в питона igraph

g.es[0]['color'] = some_color 

Однако для этого необходимо знать индекс списка края, здесь 0. Предположим, что я знаю только исходный-целевой кортеж края, скажем (0,1), есть ли простой способ сделать это, используя этот кортеж, или мне нужно перебирать весь граф для определения индекса края?

ответ

1

Вы можете построить диктовку всех кортежей-источников, указывающих на индексы, что значительно увеличит время доступа. Конечно, это имеет смысл, если вы хотите делать это часто; иначе итерация должна быть быстрее.

d = { node['source-target']: index for index, node in enumerate(g.es) } 
print d[(0,1)] # will print 0 

Примечание: Я не нашел igraph вещи, так что я должен догадаться, как получить источник-кортеж из узлов; моя догадка была node['source-target'], которую вы, вероятно, придется корректировать.

Обратите также внимание на то, что может быть несколько узлов, имеющих одинаковый исходный кортеж. В этом случае вы получите только один из них. Если вам нужно все (например, список), мы можем это изменить. Просто указать более ясно :)

+0

Ах я вижу, ваше последнее утверждение также может быть причиной, почему нет простого решения, как 'g.es [(0,1)]', доступ к узлу с помощью своего кортежа неоднозначно. – flonk

0

Самый быстрый способ я нашел, чтобы сделать это таким образом:

g.es.find(_between=((v_src.index,), (v_dest.index,))) 

Да, это странно ... источник и цель в _between кортежа сами являются кортежи (и если вы используете search вместо find, и указаны несколько начальных/конечных вершин, он вернет список всех квалификационных ребер). Если у вас есть igraph.Vertex, вы можете получить такие индексы; если у вас уже есть индексы, просто используйте их напрямую.

Существует также способ сделать это: (!)

# DON'T DO THIS! 
g.es.find(_source=v_src.index, _target=v_dest.index) 

, но по какой-то причине, то есть несколько порядков медленнее ...

In [23]: %timeit G.g.es.find(_between=((0,), (4,))) 
10000 loops, best of 3: 128 µs per loop 

In [24]: %timeit G.g.es.find(_source=0, _target=4) 
100 loops, best of 3: 1.72 ms per loop 
2

Используйте get_eid метод объекта графа для получения идентификатора произвольного ребра между двумя заданными вершинами; например .:

g.es[g.get_eid(0, 1)]["color"] = "red" 

 Смежные вопросы

  • Нет связанных вопросов^_^