繁体   English   中英

通过python igraph中的source-target-tuple选择单个边缘

[英]Select individual edges by source-target-tuple in python igraph

对于给定的图形g我想为给定的单个边更改一个属性,例如'color' ,可以这样完成

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

但是,这需要知道边缘的列表索引,此处为0 假设我只知道边缘的源目标元组,例如(0,1) ,是否有一种简单的方法可以使用该元组执行上述操作,还是我必须遍历整个图来确定边缘索引?

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

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

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

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

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

还请注意,可能存在多个具有相同源-目标元组的节点。 在这种情况下,您只会得到其中之一。 如果您需要全部(例如作为列表),我们可以更改它。 只需更清楚地指定:)

我发现最快的方法是这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM