如果你有一个有向多边加权图,你是怎么做这些事情的?
- 对于顶点 I 和 J,列出从 I 到 J 的所有边。
- 删除图中权重大于 10 的所有边。
对于 1,我可以列出所有传出边,然后按目标节点过滤。这似乎可能效率低下,是否有某种方法可以直接获得边缘?对于 2,我可以列出所有边,查找每个权重,然后在需要时删除边。有没有一种简洁的惯用方式来做到这一点?
至于#1,不幸的是,没有比您提到的更简单的解决方案(即查询所有传出边缘,然后根据目的地进行过滤)。igraph 的 C 核心有一个函数igraph_get_eids_multi
,它可以做你想做的事情,但没有对应的 Python 接口。
至于#2,您可以这样做(假设这g
是您的图形对象,weight
是保存权重的边缘属性的名称,并且gt
代表“大于”):
g.es.select(weight_gt=10).delete()
whereg.es
表示整个图的边序列,它的select
方法根据一些条件对边序列进行子集化(EdgeSeq.select
更多细节参见 的文档),返回另一个EdgeSeq
. 然后过滤边缘序列的delete()
方法删除边缘。