类文档

表示图中边序列的类。

这个类最容易通过以下方式访问: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 为所有顶点设置给定边属性的值
定义 __call__(self, *args, **kwds): (源码)

select() 的简写表示法

此方法仅将其所有参数传递给 EdgeSeq.select()

定义 attributes(self): (源码)

返回与此边序列关联的图中所有边属性的列表。

定义 find(self, *args, **kwds): (源码)

返回边序列中符合某些条件的第一个边。

选择标准与 VertexSeq.select 允许的标准相同。有关更多详细信息,请参阅 VertexSeq.select

例如,要在图 g 中查找权重大于 5 的第一个边g:

>>> g.es.find(weight_gt=5)           #doctest:+SKIP
定义 select(self, *args, **kwds): (源码)

根据某些条件选择边序列的子集

选择标准可以通过位置参数和关键字参数指定。位置参数总是在关键字参数之前处理。

  • 如果第一个位置参数是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.

如果关键字参数以下划线(_)开头,则会被特殊处理。这些不是真正的属性,而是指边的特定特性,例如它们的中心性。规则如下:

  1. _source或 {_from} 表示边的源顶点。对于无向图,仅支持eq运算符,并将其视为 {_incident}(因为无向图没有边的方向性概念)。
  2. _target或 {_to} 表示边的目标顶点。对于无向图,仅支持eq运算符,并将其视为 {_incident}(因为无向图没有边的方向性概念)。
  3. _within忽略运算符并检查边的两个端点是否都在指定集合内。
  4. _between忽略运算符并检查边的*一个*端点是否在指定集合内,以及*另一个*端点是否在另一个指定集合内。这两个集合必须以元组形式给出。
  5. _incident忽略运算符并检查边是否与特定顶点或一组顶点关联。
  6. 否则,名称的其余部分将被解释为 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)
返回
新的、已过滤的边序列