Python 基于igraph中的源/目标选择边
是否有一种简单的方法可以根据igraph中的源和目标选择/删除边 我使用的基本上是Python 基于igraph中的源/目标选择边,python,igraph,Python,Igraph,是否有一种简单的方法可以根据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) 但是我觉得应该有一种方法可以做到这一点,而不必存储源/目标信息两次。只需使用\u so
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)
但是我觉得应该有一种方法可以做到这一点,而不必存储源/目标信息两次。只需使用
\u source=where
和\u target=where
作为选择的关键字参数,例如:
g.es.select(_source=root)
或者,您可以使用图中的事件
方法,该方法为您提供一个边ID列表,而不是过滤后的EdgeSeq
,如果这更符合您的目的:
g.incident(root, mode="out")
顺便说一句,对于“元组”,您希望在
之间使用\u:
g.es.find(_between=((source_id,), (target_id,)))
这看起来很奇怪-如果您使用select
而不是find
,并传入具有多个索引的元组,您实际上会得到一个边列表而不是一个边列表。但是对于单个边缘,仍然必须传递一个元组作为开始和结束
出于某种原因,这比使用源代码和目标代码的组合要快得多(比如,快3个数量级!),但给出的信息完全相同。谢谢!事实上,我意识到你的解决方案只适用于igraph 0.6,而我使用的版本(ubuntu主存储库中的版本)已经过时。一个可能的解决办法是使用igraph自己的PPA,它总是包含最新的稳定版本:这似乎效率低下。如果同时指定源和目标,是否为固定时间查找;在这种情况下,最好使用g.es[g.get_eid(source,target)]
,这类似于O(logd)
,其中d
是所涉及的两个顶点的度数中较小的一个。请注意,g.get_eid仅返回一个索引,即使这两个节点之间有多条边。请注意,此方法适用于无向图和没有平行边的图。如果两个节点之间存在两条边(例如在有向图或具有平行边的无向图中),则此callgood点只返回一条任意边。。。它不是真正的源id和目标id:在我的有向图中,我很少有两个方向的路径,但有一种情况下是这样的。在这种情况下,\u-between
总是返回这些边中的一条,以我对“源”和“目标”的顺序为准。然而:g.es.find(\u source=s,\u target=t)
=22.7ms,g.es.find(\u between=((s,),(t,))
=293us,g.get\u eid(s,t)
=342ns,所以这可能是最好的通用方法。