Python + networkx 图结构生成展示与操作详解

介绍

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'] 

检查顶点是否存在

检查一个顶点是否存在于图中:

  1. 可以使用 n in g 方式来判断
  2. 也可以使用函数 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, {})])

如果想查看特定的边的信息:

  1. g[1][2] 查看顶点 1 和顶点 2 之间的边的心思
  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: {}})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值