9

有没有一种简单的方法可以根据 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)

但我觉得应该有一种方法可以做到这一点,而无需两次存储源/目标信息。

4

2 回答 2

13

只需使用_source=whateverand_target=whatever作为关键字参数select,例如:

g.es.select(_source=root)

或者,您可以使用图表的方法,如果这对您的目的更好incident,它会为您提供边缘 ID 列表而不是过滤:EdgeSeq

g.incident(root, mode="out")
于 2013-01-30T09:27:27.873 回答
2

顺便说一句,对于“元组”,您要使用_between

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

看起来很奇怪——如果你使用select而不是find,并传入具有多个索引的元组,你实际上会得到一个边列表而不是单个边。但是对于单个边缘,仍然必须为开始和结束传递一个元组。

由于某种原因,这比使用_sourceand的组合要快得多(例如快 3 个数量级!) _target,但提供完全相同的信息。

于 2014-01-23T14:17:18.950 回答