表示图中边的序列的类。
此类最容易通过以下方式访问esGraph
对象的字段,它返回图中所有边的有序序列。可以通过调用 EdgeSeq.select()
方法来优化边序列。也可以通过简单地调用 EdgeSeq
对象来访问 EdgeSeq.select()
。
创建引用给定图的边序列的另一种方法是直接使用构造函数
>>> g = Graph.Full(3) >>> es = EdgeSeq(g) >>> restricted_es = EdgeSeq(g, [0, 1])
可以通过索引边序列对象来访问各个边。它也可以用作可迭代对象,甚至可以在列表推导式中使用
>>> g=Graph.Full(3) >>> for e in g.es: ... print(e.tuple) ... (0, 1) (0, 2) (1, 2) >>> [max(e.tuple) for e in g.es] [1, 2, 2]
边序列也可以用作字典,其中键是属性名称。与键对应的值是图中每个边的给定属性的值
>>> g=Graph.Full(3) >>> for idx, e in enumerate(g.es): ... e["weight"] = idx*(idx+1) ... >>> g.es["weight"] [0, 2, 6] >>> g.es["weight"] = range(3) >>> g.es["weight"] [0, 1, 2]
如果指定的序列比 EdgeSeq 中的边数短,则会重复使用该序列
>>> g = Graph.Tree(7, 2) >>> g.es["color"] = ["red", "green"] >>> g.es["color"] ['red', 'green', 'red', 'green', 'red', 'green']
甚至可以传递单个字符串或整数,它将被视为长度为 1 的序列
>>> g.es["color"] = "red" >>> g.es["color"] ['red', 'red', 'red', 'red', 'red', 'red']
边序列的某些方法只是 Graph
对象中相应方法的代理方法。一个这样的例子是EdgeSeq.is_multiple():
>>> g=Graph(3, [(0,1), (1,0), (1,2)]) >>> g.es.is_multiple() [False, True, False] >>> g.es.is_multiple() == g.is_multiple() True
方法 | __call__ |
select() 的简写符号 |
方法 | 属性 |
返回与此边序列关联的图中所有边属性的列表。 |
方法 | find |
返回与某些条件匹配的边序列的第一条边。 |
方法 | select |
根据某些条件选择边序列的子集 |
继承自 EdgeSeq
方法 | __new__ |
创建并返回一个新对象。有关准确的签名,请参见 help(type)。 |
方法 | attribute |
返回图的边的属性名称列表 |
方法 | get |
返回所有边的给定边属性的值。 |
方法 | is |
返回边序列是否恰好包含所有边一次,并按其边 ID 的顺序排列。 |
方法 | set |
为所有顶点设置给定边属性的值 |
返回与某些条件匹配的边序列的第一条边。
选择标准与 VertexSeq.select
允许的标准相同。有关更多详细信息,请参见 VertexSeq.select
。
例如,要查找图中权重大于 5 的第一条边g:
>>> g.es.find(weight_gt=5) #doctest:+SKIP
根据某些条件选择边序列的子集
可以通过位置参数和关键字参数来指定选择标准。位置参数始终在关键字参数之前处理。
- 如果第一个位置参数是无,则返回一个空序列。
- 如果第一个位置参数是可调用对象,则将为序列中的每条边调用该对象。如果它返回True,则将包括该边,否则将排除该边。
- 如果第一个位置参数是可迭代对象,则它必须返回整数,并且它们将被视为当前边集的索引(NOT 图的整个边集 - 当一个人过滤已被先前调用过滤的边集时,差异很重要
EdgeSeq.select()
。在这种情况下,索引不直接指向图的边,而是指向过滤后的边序列的元素。 - 如果第一个位置参数是整数,则期望所有剩余参数都是整数。它们再次被视为当前边集的索引。
关键字参数可用于根据边的属性和特性过滤边。关键字的名称指定属性的名称和过滤运算符,它们应通过下划线连接(_) 字符连接。属性名称也可以包含下划线,但运算符名称不包含,因此运算符始终是不包含下划线的关键字名称的最大尾随子字符串。可能的运算符是
- eq:等于
- ne:不等于
- lt:小于
- gt:大于
- le:小于或等于
- ge:大于或等于
- in:检查属性的值是否在给定列表中
- notin:检查属性的值是否不在给定列表中
例如,如果要过滤数字weight属性大于 50,则必须编写
>>> g.es.select(weight_gt=50) #doctest: +SKIP
类似地,要过滤type是否在预定义类型列表中的顶点
>>> list_of_types = ["inhibitory", "excitatory"] >>> g.es.select(type_in=list_of_types) #doctest: +SKIP
如果省略运算符,则默认为eq的边。例如,以下选择器选择type属性为intracluster:
>>> g.es.select(type="intracluster") #doctest: +SKIP
在未知运算符的情况下,假定识别的运算符是属性名称的一部分,并且实际运算符是eq.
的边。如果关键字参数以下划线开头,则将对其进行特殊处理(_)。这些不是真实属性,而是指边的特定属性,例如,它们的中心性。规则如下
- _source或 {_from} 表示边的源顶点。对于无向图,仅支持eq运算符,并且将其视为 {_incident}(因为无向图没有边的方向性的概念)。
- _target或 {_to} 表示边的目标顶点。对于无向图,仅支持eq运算符,并且将其视为 {_incident}(因为无向图没有边的方向性的概念)。
- _within忽略运算符,并检查边的两个端点是否位于指定的集合中。
- _between忽略运算符,并检查边的一个端点是否位于指定的集合中,而另一个端点位于另一个指定的集合中。这两个集合必须作为元组给出。
- _incident忽略运算符,并检查边是否与特定顶点或一组顶点相关联。
- 否则,名称的其余部分将解释为
Graph
对象的方法。此方法以边序列作为其第一个参数(所有其他参数保留为默认值)调用,并根据该方法返回的值过滤边。
例如,如果要排除介数中心性小于 2 的边
>>> g = Graph.Famous("zachary") >>> excl = g.es.select(_edge_betweenness_ge = 2)
要选择源自顶点 2 和 4 的边
>>> edges = g.es.select(_source_in = [2, 4])
要选择完全位于由顶点 2、3、4 和 7 生成的子图中的边
>>> edges = g.es.select(_within = [2, 3, 4, 7])
要选择一个端点位于包含顶点 2、3、4 和 7 的顶点集中,而另一个端点位于包含顶点 8 和 9 的顶点集中的边
>>> edges = g.es.select(_between = ([2, 3, 4, 7], [8, 9]))
对于需要很长时间才能计算的属性(例如,大型图的介数中心性),建议提前计算值并将其存储在图属性中。当您在同一select()调用中多次基于同一属性进行选择时,也适用相同的规则,以避免不必要地计算两次。例如,以下代码将计算两次介数中心性
>>> edges = g.es.select(_edge_betweenness_gt=10, # doctest:+SKIP ... _edge_betweenness_lt=30)
建议使用以下代码代替
>>> g.es["bs"] = g.edge_betweenness() >>> edges = g.es.select(bs_gt=10, bs_lt=30)
返回值 | |
新的、经过过滤的边序列 |