networkx2.5知识梳理
注:本文所有代码均可在networkx2.5运行
1、基础知识
1.1、介绍
networkx在2002年5月产生,是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。
networkx支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用。
1.2、作用
利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等。
1.3、Graph
1.3.1、Graph的定义
Graph是用点和线来刻画离散事物集合中的每对事物间以某种方式相联系的数学模型。
网络作为图的一个重要领域,包含的概念与定义更多,如有向图网络(Directed Graphs and Networks)、无向图网络(Undirected)等概念。
Graph在现实世界中随处可见,如交通运输图、旅游图、流程图等。此处我们只考虑由点和线所组成的图。
利用图可以描述现实生活中的许多事物,如用点可以表示交叉口,点之间的连线表示路径,这样就可以轻而易举的描绘出一个交通运输网络。
1.3.2、Graph的结构
根据Graph的定义,一个Graph包含一个节点集合和一个边集。
在NetworkX中,一个节点可以是任意hash对象(除了None对象),一条边也可以关联任意的对象,像一个文本字符串,一幅图像,一个XML对象,甚至是另一个图或任意定制的节点对象。
注意:Python中的None对象是不可以作为节点的类型的。
节点与边能够存储任意类型字典的属性和任意其他丰富类型的数据。
1.3.3、Graph分类
- Graph:指无向图(undirected Graph),即忽略了两节点间边的方向。
- DiGraph:指有向图(directed Graph),即考虑了边的有向性。
- MultiGraph:指多重无向图,即两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联。
- MultiDiGraph:多重图的有向版本。
G = nx.Graph() # 创建无向图
G = nx.DiGraph() # 创建有向图
G = nx.MultiGraph() # 创建多重无向图
# G = nx.MultiDigraph() # 创建多重有向图 AttributeError: module 'networkx' has no attribute 'MultiDigraph'
G.clear() #清空图
2、基本操作
2.1、无向图
- 节点
————如果添加的节点和边是已经存在的,是不会报错的,NetworkX会自动忽略掉已经存在的边和节点的添加。
#添加节点
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph() #建立一个空的无向图G
G.add_node('a') #添加一个节点1
G.add_nodes_from(['b','c','d','e']) #加点集合
#G.add_cycle(['f','g','h','j']) #加环
H = nx.path_graph(10) #返回由10个节点挨个连接的无向图,所以有9条边
G.add_nodes_from(H) #创建一个子图H加入G
G.add_node(H) #直接将图作为节点
nx.draw(G, with_labels=True)
plt.show()
#访问节点
print('图中所有的节点', G.nodes())
print('图中节点的个数', G.number_of_nodes())
图中所有的节点 ['a', 'b', 'c', 'd', 'e', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, <networkx.classes.graph.Graph object at 0x000001F9A7A9DAC8>]
图中节点的个数 16
#删除节点
G.remove_node(1) #删除指定节点
G.remove_nodes_from(['b','c','d','e']) #删除集合中的节点
nx.draw(G, with_labels=True)
plt.show()
- 边
#添加边
F = nx.Graph() # 创建无向图
F.add_edge(11,12) #一次添加一条边
#等价于
e=(13,14) #e是一个元组
F.add_edge(*e) #这是python中解包裹的过程
F.add_edges_from([(1,2),(1,3)]) #通过添加list来添加多条边
#通过添加任何ebunch来添加边
F.add_edges_from(H.edges()) #不能写作F.add_edges_from(H)
nx.draw(F, with_labels=True)
plt.show()