在igraph中基于源/目标选择边

9 投票
2 回答
6144 浏览
提问于 2025-04-17 14:08

有没有简单的方法可以根据边的起点和终点来选择或删除边,在igraph中?

我现在用的基本上是

g.es["source"] = [e.source for e in g.es]
g.es["target"] = [e.target for e in g.es]    
g.es["tuple"]  = [e.tuple  for e in g.es]        

g.es.select(target=root)

但我觉得应该有办法做到这一点,而不需要把起点和终点的信息存储两次。

2 个回答

2

顺便说一下,对于“元组”,你应该使用 _between

g.es.find(_between=((source_id,), (target_id,)))

这看起来有点奇怪——如果你用 select 而不是 find,并传入多个索引的元组,你实际上会得到一系列边,而不是单独的一条边。不过,如果你只想要一条边,还是得传入一个表示起点和终点的元组。

出于某种原因,这种方式要快得多(快了大约三倍!),但得到的信息却是完全一样的。

13

只需将 _source=whatever_target=whatever 作为关键字参数传递给 select 方法,比如:

g.es.select(_source=root)

另外,你也可以使用图的 incident 方法,这样可以得到一份边的ID列表,而不是过滤后的 EdgeSeq,如果这样更适合你的需求的话:

g.incident(root, mode="out")

撰写回答