Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于igraph中的源/目标选择边_Python_Igraph - Fatal编程技术网

Python 基于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

是否有一种简单的方法可以根据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 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,所以这可能是最好的通用方法。