在python igraph中按source-target-tuple选择单个边

时间:2014-01-23 09:05:05

标签: python igraph

对于给定的图表g,我想更改某个属性,例如'color',针对给定的个别边缘,可以这样做

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

但是,这需要知道边缘的列表索引,这里是0。假设我只知道边缘的源 - 目标 - 元组,比如(0,1),是否有一种使用该元组进行上述操作的简单方法,或者我是否必须遍历整个图来确定边缘索引?

3 个答案:

答案 0 :(得分:2)

使用图形对象的get_eid方法获取两个给定顶点之间任意边的ID; e.g:

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

答案 1 :(得分:1)

您可以构建指向索引的所有源目标元组的dict,这会大大增加访问时间。当然,只有你想经常这样做才有意义;否则迭代应该更快。

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

注意:我没有找到igraph的东西,所以我不得不猜测如何从节点中获取源目标元组;我的猜测是node['source-target']你可能需要调整。

另请注意,可能有多个节点具有相同的源 - 目标元组。在这种情况下,您将只获得其中一个。如果你需要所有(例如列表),我们可以改变它。只需更清楚地说明:)

答案 2 :(得分: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