Python networkx包的学习

在用到一个医学图像增强工具的时候发现他用了这个包,所以简单的学习了一些关于这个包的基础知识,这个包是开发的关于图论和复杂网络建模工具,我这里只学习了一些简单的关于图的创建和遍历的一些简单操作,具体如下程序所示

import networkx as nx

g = nx.Graph() # 创建空的无向图

# g = nx.DiGraph() # 创建空的有向图

'''
图的节点的相关操作
'''
# 在向图中增加结点时,可以一次增加一个,也可一次增加多个,节点的ID属性是必需的
g.add_node(1)
print(g.nodes) # 若要查看图中顶点情况,需要用.nodes
# [1]
g.add_nodes_from([2,3,4])
print(g.nodes)
# [1, 2, 3, 4]

# 在向图中添加节点时,除ID属性外,也可以增加自定义属性
g.add_node(1, name = 'n1', weight = 1)
g.add_node(2, name = 'n2', weight = 2)
print(g.nodes)
# [1, 2, 3, 4]
print(g._node) # 返回字典结构
# {1: {'name': 'n1', 'weight': 1}, 2: {'name': 'n2', 'weight': 2}, 3: {}, 4: {}}
print(g.nodes(data=True)) # 返回的是一个列表
# [(1, {'name': 'n1', 'weight': 1}), (2, {'name': 'n2', 'weight': 2}), (3, {}), (4, {})]
print(g.nodes[1])
# {'name': 'n1', 'weight': 1}
print(g.nodes[1]['name'])
# n1

# 删除节点,使用remove
g.remove_node(1)
print(g.nodes)
# [2, 3, 4]
g.remove_nodes_from([3,4])
print(g.nodes)
# [2]

# 更新节点,使用update
g._node[2].update({'name': 'new n2'})
g._node[2].update({'weight': 1.5})
print(g.nodes[2])
# {'name': 'new n2', 'weight': 1.5}

# 删除节点的某一属性,使用del
g.add_node(1, name = 'n1', weight = 1)
del g.nodes[1]['name']
# del g.nodes[1]['room'] # 会报错KeyError: 'room'
print(g.nodes[1])
# {'weight': 1}

# 检查是否存在某一个节点
print(g.has_node(5))
# False

'''
图中对于边的操作
'''
# 增加边,两个节点之间有一条边,若某个节点不存在,则自动将节点加入图中
g.add_edge(1,2)
g.add_edge(3,5)
print(g.edges)
print(g.has_node(5)) # True
# [(2, 1), (3, 5)]
# 也可同时加入多条边
g.add_edges_from([(3,6), (2,5)])
print(g.edges)
# [(2, 1), (2, 5), (3, 5), (3, 6)]
# 也可以像节点一样对边增加属性
g.add_edge(1,2, weight = 2, relationship='friends')
print(g.edges(data=True))
# [(2, 1, {'weight': 2, 'relationship': 'friends'}), (2, 5, {}), (3, 5, {}), (3, 6, {})]
# 也提供了一个函数可以直接添加边的权重值,下面函数输入的三元素,前两个是节点ID,第三个是权重值
g.add_weighted_edges_from([(1, 2, 0.9)])
print(g.edges(data = True))
# [(2, 1, {'weight': 0.9, 'relationship': 'friends'}), (2, 5, {}), (3, 5, {}), (3, 6, {})]
print(g[1][2])
# {'weight': 0.9, 'relationship': 'friends'}

# 删除边
g.remove_edge(1,2)
print(g.edges)
# [(2, 5), (3, 5), (3, 6)]
g.remove_edges_from([(1,2), (3,5)])
print(g.edges)
# [(2, 5), (3, 6)]

# 更新边的属性和删除边的属性以及检查边是否存在与节点类似,只需将函数中的node换成edge

'''
图的属性,adj  edges   nodes  degree
对于无向图,节点的度是指跟节点相连的边的数量
'''
print(g.adj)
# {2: {5: {}}, 1: {}, 3: {6: {}}, 5: {2: {}}, 6: {3: {}}}
print(g.edges)
# [(2, 5), (3, 6)]
print(g.nodes)
# [2, 1, 3, 5, 6]
print(g.degree)
# [(2, 1), (1, 0), (3, 1), (5, 1), (6, 1)]

'''
图的遍历
'''
for i in g.adjacency():
    print(i)
'''
(2, {5: {}})
(1, {})
(3, {6: {}})
(5, {2: {}})
(6, {3: {}})
'''

'''
绘制图
'''
nx.draw(g)
import matplotlib.pyplot as plt
plt.show()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值