python-igraph API 参考

python-igraph 中所有类、函数和方法的列表

类文档

class EdgeSeq(_EdgeSeq)

在层级结构中查看

表示图中边的序列的类。

此类最容易通过以下方式访问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() 的简写符号
方法 attributes 返回与此边序列关联的图中所有边属性的列表。
方法 find 返回边序列中第一个匹配某些条件的边。
方法 select 根据某些条件选择边序列的子集

继承自 EdgeSeq

方法 attribute_names 返回图的边的属性名称列表
方法 get_attribute_values 返回所有边的给定边属性的值。
方法 is_all 返回边序列是否恰好包含所有边一次,并按其边 ID 的顺序排列。
方法 set_attribute_values 为所有顶点设置给定边属性的值
def __call__(self, *args, **kwds):

select() 的简写符号

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

def attributes(self):

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

def find(self, *args, **kwds):

返回边序列中第一个匹配某些条件的边。

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

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

>>> g.es.find(weight_gt=5)           #doctest:+SKIP
def 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)
返回值
中多次基于同一属性进行选择时,也适用此方法。新的、经过筛选的边序列