对于给定的图表g
,我想更改某个属性,例如'color'
,针对给定的个别边缘,可以这样做
g.es[0]['color'] = some_color
但是,这需要知道边缘的列表索引,这里是0
。假设我只知道边缘的源 - 目标 - 元组,比如(0,1)
,是否有一种使用该元组进行上述操作的简单方法,或者我是否必须遍历整个图来确定边缘索引?
答案 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