表示图中边序列的类。
这个类最容易通过以下方式访问:esGraph
对象的字段,它返回图中所有边的有序序列。边序列可以通过调用 EdgeSeq.select()
方法进行细化。EdgeSeq.select()
也可以通过简单地调用 EdgeSeq
对象来访问。
创建引用给定图的边序列的另一种方法是直接使用构造函数
>>> 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() 的简写表示法 |
方法 | attributes |
返回与此边序列关联的图中所有边属性的列表。 |
方法 | find |
返回边序列中符合某些条件的第一个边。 |
方法 | select |
根据某些条件选择边序列的子集 |
继承自 EdgeSeq
方法 | attribute_names |
返回图的边的属性名称列表 |
方法 | get_attribute_values |
返回所有边的给定边属性的值。 |
方法 | is_all |
返回边序列是否精确包含所有边一次,并按其边 ID 顺序排列。 |
方法 | set_attribute_values |
为所有顶点设置给定边属性的值 |
返回边序列中符合某些条件的第一个边。
选择标准与 VertexSeq.select
允许的标准相同。有关更多详细信息,请参阅 VertexSeq.select
。
例如,要在图 g 中查找权重大于 5 的第一个边g:
>>> g.es.find(weight_gt=5) #doctest:+SKIP
根据某些条件选择边序列的子集
选择标准可以通过位置参数和关键字参数指定。位置参数总是在关键字参数之前处理。
- 如果第一个位置参数是None,则返回一个空序列。
- 如果第一个位置参数是可调用对象,则该对象将为序列中的每个边被调用。如果它返回True,则该边将被包含,否则将被排除。
- 如果第一个位置参数是可迭代对象,它必须返回整数,这些整数将被视为当前边集的索引(而不是图的整个边集——当一个边集已经被
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)
返回 | |
新的、已过滤的边序列 |