当前位置: 首页 > 工具软件 > igraph > 使用案例 >

igraph基本用法

金秦斩
2023-12-01

官方参考文档http://www.cs.rhul.ac.uk/home/tamas/development/igraph/tutorial/tutorial.html

Starting igraph

从igraph模块中导入所有函数

from igraph import *
g = Graph(1) # 此时的graph只有1个顶点,0条边
print(g)

Out: IGRAPH U— 1 0 –

add_vertices()

Graph.add_vertices()的作用是给graph添加顶点数,并且返回这个graph

g.add_vertices(2)	# 此时的graph有3个顶点,0条边

graph的顶点从0开始标号,即3个顶点对应编号为0, 1, 2

add_edges()

1.Graph.add_edges()的作用是添加边的,边必须由整数对指定,比如(0, 1)表示顶点0与顶点1之间添加边
2.函数添加边时需要列表符号[]
3.当添加的边的顶点编号不存在比如g.add_edges((5, 0)),程序报错
4.边也存在编号,同样是从0开始

g.add_edges([(0, 1), (1, 2)])	# 此时的graph有3个顶点,2条边
# 添加更多的边和顶点数
g.add_edges([(2, 0)])
g.add_vertices(3)
g.add_edges([(2, 3), (3, 4), (4, 5), (5, 3)])

Out: IGRAPH U— 6 7 –
edges: 0–1 1–2 0–2 2–3 3–4 4–5 3–5
此时的graph (无向图)6个顶点,7条边;edges表示哪些顶点之间存在边的关系

delete_edges()

delete_edges()作用为边的删除,函数需要由边的编号组成的列表或者是单独的边的编号

delete_vertices()

1.delete_edges()作用为顶点的删除,函数需要由顶点的编号组成的列表或者是单独的顶点的编号

get_eid()

get_eid作用为获取连接两个顶点边的编号,当你不知道需要删除的边的编号时,可以使用这个函数

g.get_eid(2, 3)		# out: 3
# 此时graph删除编号为3的边
g.delete_edges(3)
print(g)

Out: IGRAPH U— 6 6 –
edges: 0–1 1–2 0–2 3–4 4–5 3–5

summary()

summary()作用是获取给定的graph的概述
1.列举出边和顶点的个数
2.检查图有向或无向
3.计算图连通分量的个数
4.计算图的直径, 边缘密度,平均路径的长度

summary(g)

官方文档上的结果是 :
Out: 6 vertices, 6 edges, undirected
Number of components: 2
Diameter: 1
Density: 0.4000
Average path length: 1.0000

我自己运行的结果是:
Out: IGRAPH U— 6 6 –
不知道哪里出了问题,可能跟igraph的版本有关

Generating graphs

igraph包含了大量的图生成器,具体可以被分为两大类,确定性图生成器和随机性图生成器
确定性图生成器:只要输入相同的参数,就会生成相同的图
随机性图生成器即每次都生成不同的图

Graph.Tree()

Graph.Tree()作用是生成一个常规的树形图

g1 = Graph.Tree(127, 2)
summary(g1)

Out: IGRAPH U— 127 126 –
生成127个节点;除叶子节点,每个节点有两个子节点

只要参数不改变,生成的图都是一样的

g2 = Graph.Tree(127, 2)

get_edgelist()

get_edgelist()作用是返回包含整数对的列表
其中的整数对就是边两端的顶点整数对

g2.get_edgelist() == g1.get_edgelist()	# out:	True

证明了 只要参数不改变,生成的图都是一样的

输出前10条边对应的顶点整数对

print(g2.get_edgelist()[0: 10])

Out: [(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), (2, 6), (3, 7), (3, 8), (4, 9), (4, 10)]

Graph.GRG()

Graph.GRG()作用是生成一个几何随机图
原理是在单位正方形里随机均匀的选择n个点,任意两个点之间的距离如果比预定的距离d小,就用边相连

g1 = Graph.GRG(100, 0.2)
summary(g1)

Out: IGRAPH U— 100 509 –
因为是随机生成图,无论是同一个参数,同一台电脑,每次生成的图都不一样
验证:

g2 = Graph.GRG(100, 0.2)
g1.get_edgelist() == g2.get_edgelist()

Out: False

isomorphic()

isomorphic()作用是判断两个图是不是同构图,即两个图是否完全等价
原理是检查两个图顶点的度

g1.isomorphic(g2)

Out: False

Setting and retrieving attributes

手动创建一个设想中的社交关系图 顶点表示人,边代表他们之间的社交关系

g = Graph([(0,1), (0,2), (2,3), (3,4), (4,2), (2,5), (5,0), (6,3), (5,6)])

vs和es

创建额外的列表储存信息与顶点ID相关联 每个Graph都包含两个特殊的成员: vs表示所有顶点的序列;es表示所有边的序列 如果使用vs或es作为字典,可以操作图的属性存储区域

g.vs["name"] = ["Alice", "Bob", "Claire", "Dennis", "Esther", "Frank", "George"]
g.vs["age"] = [25, 31, 18, 47, 22, 23, 50]
g.vs["gender"] = ["f", "m", "f", "m", "f", "m", "m"]
g.es["is_formal"] = [False, False, True, True, True, False, True, False, False]

当使用vs或es作为字典,都在将属性分配给图的所有顶点或边;
可以使用下标索引号对单独的顶点或边进行修改

g.es[0]

Out: igraph.Edge(<igraph.Graph object at 0x000002CA4CDB1228>, 0, {‘is_formal’: False})

g.es[0].attributes()

Out: {‘is_formal’: False}

g.es[0]["is_formal"]

Out: False

使用下标索引号对属性进行修改

g.es[0]["is_formal"] = True
g.es[0]["is_formal"]

Out: True

attributes()

无论是单独的索引号还是使用attributes()函数,都会输出此顶点或边的对应信息

g.vs[0]

Out: igraph.Vertex(<igraph.Graph object at 0x000002CA4CDB1228>, 0, {‘name’: ‘Alice’, ‘age’: 25, ‘gender’: ‘f’})

g.vs[0].attributes()

Out: {‘age’: 25, ‘gender’: ‘f’, ‘name’: ‘Alice’}

Grap本身也可以作为一个字典, 为整个图分配属性

g["date"] = "2021-10-30"
print(g["date"])

Out: 2021-10-30

del

del是python的关键词,可以直接删除属性

g.vs[3]["foo"] = "bar"
g.vs["foo"]

Out: [None, None, None, ‘bar’, None, None, None]

del g.vs["foo"]
g.vs["foo"]

Out: ‘Attribute does not exist’

Structural properties of graphs

igraph提供了很多函数计算不同图的结构属性

degree()

计算顶点的度
如果图是有向图,可以使用degree(type=“in”)和degree(type=“out”)计算入度和出度

g.degree()

Out: [3, 1, 4, 3, 2, 3, 2]

也可以输入单个顶点ID或者是一个列表的顶点ID查询,如果省略括号内的内容就默认为顶点的集合

g.degree(6)
g.degree([2, 3, 4])

Out: 2
Out: [4, 3, 2]

未完待续

 类似资料: