python-igraph API 参考

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

类文档

表示图中边的序列的类。

此类最容易通过以下方式访问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_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):

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

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

  • 如果第一个位置参数是,则返回一个空序列。
  • 如果第一个位置参数是可调用对象,则将为序列中的每条边调用该对象。如果它返回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.

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

  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)
返回值
新的、经过过滤的边序列