图生成
大多数 igraph 应用程序的第一步是生成一个图。本节将解释多种生成图的方法。有关每个函数和类的详细信息,请阅读API 参考。
Graph
类是用于生成图的主要对象。
>>> from igraph import Graph
要复制图,请使用 Graph.copy()
>>> g_new = g.copy()
从节点和边生成
节点总是从 0 开始向上编号。要创建一个具有指定节点数(例如 10 个)和它们之间边列表的通用图,您可以使用通用构造函数:
>>> g = Graph(n=10, edges=[[0, 1], [2, 3]])
如果未指定,图是无向的。要创建有向图:
>>> g = Graph(n=10, edges=[[0, 1], [2, 3]], directed=True)
要指定边权重(或任何其他顶点/边属性),请使用字典:
>>> g = Graph(
... n=4, edges=[[0, 1], [2, 3]],
... edge_attrs={'weight': [0.1, 0.2]},
... vertex_attrs={'color': ['b', 'g', 'g', 'y']}
... )
要从类型列表和边列表创建二分图,请使用 Graph.Bipartite()
。
从 Python 内置结构(列表、元组、字典)生成
igraph 支持多种“转换”方法,用于从 Python 内置数据结构(如字典、列表和元组)导入图:
Graph.DictList()
: 从字典列表
Graph.TupleList()
: 从元组列表
Graph.ListDict()
: 从列表字典
Graph.DictDict()
: 从字典字典
也提供了等效的方法来导出图,即将图转换为使用 Python 内置数据结构的表示形式:
有关详细信息和示例,请参阅每个函数的API 参考。
从矩阵生成
要从邻接矩阵创建图,请使用 Graph.Adjacency()
,或者对于加权矩阵,使用 Graph.Weighted_Adjacency()
>>> g = Graph.Adjacency([[0, 1, 1], [0, 0, 0], [0, 0, 1]])
此图是有向的,并且有边 [0, 1]、[0, 2] 和 [2, 2](自环)。
要从二分邻接矩阵创建二分图,请使用 Graph.Biadjacency()
>>> g = Graph.Biadjacency([[0, 1, 1], [1, 1, 0]])
从文件生成
要从支持的任何格式的文件中加载图,请使用 Graph.Load()
。例如:
>>> g = Graph.Load('myfile.gml', format='gml')
如果您不指定格式,igraph 将尝试自行识别,如果失败,它将报错。
从外部库生成
igraph 可以读写 networkx 和 graph-tool 图格式
>>> g = Graph.from_networkx(nwx)
和
>>> g = Graph.from_graph_tool(gt)
从 pandas DataFrame(s) 生成
一种常见的做法是将边存储在 pandas.DataFrame 中,其中前两列是源顶点 ID 和目标顶点 ID,任何附加列表示边属性。您可以通过 Graph.DataFrame()
生成一个图:
>>> g = Graph.DataFrame(edges, directed=False)
可以通过单独的 DataFrame 同时设置顶点属性。假定第一列包含所有顶点 ID(包括任何没有边的顶点),任何附加列都是顶点属性:
>>> g = Graph.DataFrame(edges, directed=False, vertices=vertices)
从公式生成
要从字符串公式创建图,请使用 Graph.Formula()
,例如:
>>> g = Graph.Formula('D-A:B:F:G, A-C-F-A, B-E-G-B, A-B, F-G, H-F:G, H-I-J')
注意
这个特定的公式还为顶点分配了“name”属性。
完整图
要创建完整图,请使用 Graph.Full()
>>> g = Graph.Full(n=3)
其中 n 是节点数。您可以指定方向性以及是否包含自环:
>>> g = Graph.Full(n=3, directed=True, loops=True)
类似的方法 Graph.Full_Bipartite()
生成一个完整的二分图。最后,方法 Graph.Full_Citation()
创建了完整的引用图,其中索引为 i 的顶点与所有索引严格小于 i 的顶点都有有向边。
树和星形图
Graph.Tree()
可用于生成规则树,其中几乎每个顶点都具有相同数量的子节点:
>>> g = Graph.Tree(n=7, n_children=2)
创建一个有七个顶点(其中四个是叶子)的树。根节点(0)有两个子节点(1 和 2),每个子节点又各有两个子节点(即四个叶子)。规则树可以是定向的或无向的(默认)。
方法 Graph.Star()
创建一个星形图,它是树的一种子类型。
格图
Graph.Lattice()
创建指定大小的规则方格。例如:
>>> g = Graph.Lattice(dim=[3, 3], circular=False)
创建一个二维的 3x3 网格(总共 9 个顶点)。circular 用于将格图的每条边连接回另一侧,这个过程也称为“周期性边界条件”,有时有助于平滑边缘效应。
一维情况(路径图或环图)足够重要,值得拥有自己的构造函数 Graph.Ring()
,它可以是环形的或非环形的:
>>> g = Graph.Ring(n=4, circular=False)
图谱
Roland C. Read 和 Robin J. Wilson 所著的《图谱》(‘An Atlas of Graphs’) 一书包含了所有最多七个顶点的无标签无向图,编号从 0 到 1252。您可以使用 Graph.Atlas()
按索引创建此列表中的任何图,例如:
>>> g = Graph.Atlas(44)
图按以下顺序排列:
节点数递增顺序;
对于固定节点数,按边数递增顺序;
对于固定节点数和边数,按度序列递增顺序,例如 111223 < 112222;
对于固定度序列,按自同构数递增顺序。
著名图
igraph C 核心手册上提供了一个精选的著名图列表,这些图常用于文献中的基准测试和其他目的。您可以通过名称生成该列表中的任何图,例如:
>>> g = Graph.Famous('Zachary')
将教您一些关于武术的知识。
随机图
可以根据几种不同的模型或博弈创建随机图:
Barabási-Albert 模型:
Graph.Barabasi()
Erdős-Rényi:
Graph.Erdos_Renyi()
Watts-Strogatz:
Graph.Watts_Strogatz()
随机块模型:
Graph.SBM()
随机树:
Graph.Tree_Game()
森林火灾博弈:
Graph.Forest_Fire()
随机几何图:
Graph.GRG()
增长型:
Graph.Growing_Random()
建立博弈:
Graph.Establishment()
偏好(非增长型的建立博弈变体):
Graph.Preference()
不对称偏好:
Graph.Asymmetric_Prefernce()
近期度:
Graph.Recent_Degree()
k-正则(每个节点度为 k):
Graph.K_Regular()
非增长图,边概率与节点适应度成比例:
Graph.Static_Fitness()
非增长图,具有预设的幂律度分布:
Graph.Static_Power_Law()
具有给定度序列的随机图:
Graph.Degree_Sequence()
其他图
最后,还有一些不在前面章节涵盖的图生成方法:
Kautz 图:
Graph.Kautz()
De Bruijn 图:
Graph.De_Bruijn()
从 LCF 符号生成图:
Graph.LCF()
任何“同构类”的小图:
Graph.Isoclass()
具有指定度序列的图:
Graph.Realize_Degree_Sequence()