介绍
networkx 是 Python 的一个包,用于构建和操作复杂的图结构,提供分析图的算法。图是由顶点、边和权重等属性构成的数据结构,顶点和边可以拥有多种属性,用于存储更多的信息。
生成图
import networkx as nx
g=nx.Graph()#创建空的无向图
g=nx.DiGraph()#创建空的有向图
顶点
添加顶点
在向图中增加顶点时,可以一次增加一个顶点,也可以一次性增加多个顶点,顶点的 ID
属性是必需的。
g.add_node(1)
g.add_nodes_from([2,3,4])
在向图中添加顶点时,除 ID
属性之外,也可以向顶点中增加自定义的属性,例如,名称属性,权重属性:
g.add_node(5,name='n5',weight=1)
g.add_node(6,name='n6',weight=2)
查看顶点
在添加顶点之后,可以通过 g.nodes()
函数获得图的所有顶点的视图,返回的实际上 NodeView
对象;
>>> g.nodes()
NodeView((1, 2, 3, 4))
如果为 g.nodes(data=True)
的 data
参数设置为 true
,那么返回的是 NodeDataView
对象,该对象不仅包含每个顶点的 ID
属性,还包括顶点的其他属性。
>>> g.nodes(data=True)
NodeDataView({1: {}, 2: {}, 3: {}, 4: {}})
通过属性 _node
获得图的所有顶点和属性的信息,_node
属性返回的是一个字典结构,字典的 Key
属性是顶点的 ID
属性,Value
属性是顶点的其他属性构成的一个字典。
>>> g._node
{1: {'name': 'n1', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}}
>>>g.nodes(data=True)
还可以通过顶点的 ID
属性来查看顶点的其他属性:
>>> g.node[1]
{'name': 'n1', 'weight': 1}
>>> g.node[1]['name']
'n1 new'
更新顶点
更新图的顶点,有两种方式,第一种方式使用字典结构的 _update
函数,第二种方式是通过索引来设置新值:
>>> g._node[1].update({'name':'n1 new'})
>>> g.node[1]['name']='n1 new'
{1: {'name': 'n1 new', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}}
删除顶点
通过 remove
函数删除图的顶点,由于顶点的 ID
属性能够唯一标识一个顶点,通常删除顶点都需要通过传递 ID
属性作为参数。
# 一次删除一个顶点
g.remove_node(node_ID)
# 一次删除多个顶点
g.remove_nodes_from(nodes_list)
删除顶点的属性
使用 del
命令删除顶点的属性
del g.nodes[1]['room']
检查顶点是否存在
检查一个顶点是否存在于图中:
- 可以使用
n in g
方式来判断 - 也可以使用函数
g.has_node(n)
边
图的边用于表示两个顶点之间的关系,因此,边是由两个顶点唯一确定的。为了表示复杂的关系,通常会为边增加一个权重 weight
属性;为了表示关系的类型,也会设置为边设置一个关系属性。
加边
# 添加一条边
g.add_edge(2,3)
# 添加多条边
g.add_edges_from([(1,2),(1,3)])
增加边的属性
# 加边的同时添加边的属性
g.add_edge(1, 2, weight=4.7, relationship='renew')
g.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
# 单独添加边的权重
# 函数的参数是三元组,前两个字段表示两个顶点的 ID,第三个字段表示边的权重
g.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])
更新边
通过边来更新边的属性,由两种方式,一种是使用 update
函数,一种是通过属性赋值来实现:
g[1][2]['weight'] = 4.7
g.edge[1][2]['weight'] = 4
g[1][2].update({"weight": 4.7})
g.edges[1, 2].update({"weight": 4.7})
查看边
可以通过 g.edges()
查看所有的边
g.edges()
# EdgeView([(1, 2), (1, 3), (2, 3)])
如果需要同时查看边的属性,可以使用 g.edges(data=True)
>>> g.edges(data=True)
EdgeDataView([(1, 2, {}), (1, 3, {}), (2, 3, {})])
如果想查看特定的边的信息:
g[1][2]
查看顶点 1 和顶点 2 之间的边的心思g.get_edge_data(1,2)
>>> g[1][2]
>>> g.get_edge_data(1,2)
{'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}
删除边
# 删除一条边
g.remove_edge(edge)
# 删除多条边
g.remove_edges_from(edges_list)
删除边的属性
通过 del
命令来删除边的属性
del g[1][2]['name']
检查边是否存在
# 看在顶点 1 和 顶点 2 之间是否存在一条边
g.has_edge(1,2)
图的属性
图的属性主要是节点、边、节点的路、邻接矩阵等信息
adj
adj
返回的是一个 AdjacencyView
视图,该视图是顶点的相邻顶点和顶点的属性,用于显示用于存储与顶点相邻的顶点的数据,这是一个只读的字典结构,Key
是顶点,Value
是顶点的属性数据。
>>> g.adj[1][2]
{'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}
>>> g.adj[1]
AtlasView({2: {'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}, 3: {'weight': 0.75}})
查看节点的相邻节点
g[n]
g.adj[n]
g.neighbors(n)
>>> for n, nbrs in g.adjacency():
... print(n)
... print(nbrs)
edges
图的边是由边的两个顶点唯一确定的,边还有一定的属性,因此,边是由两个顶点和边的属性构成的:
# 只提供边的信息
>>> g.edges
EdgeView([(1, 2), (1, 3), (2, 3), (2, 4), (3, 4)])
# 提供边的属性信息
>>> g.edges.data()
EdgeDataView([(1, 2, {'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}), (1, 3, {'weight': 0.75}), (2, 3, {'weight': 8}), (2, 4, {'weight': 1.2}), (3, 4, {'weight': 0.375})])
nodes
# 节点信息
>>> g.nodes
NodeView((1, 2, 3, 4))
# 节点和节点的属性信息
>>> g.nodes.data()
NodeDataView({1: {'name': 'n1 new', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}})