python中的networkx库
转载自:https://www.cnblogs.com/minglex/p/9205160.html
在看graph RNN源代码发现他用了这个库。
1.1、Graph
1.1.1、Graph的定义
Graph是用点和线来刻画离散事物集合中的每对事物间以某种方式相联系的数学模型。
网络作为图的一个重要领域,包含的概念与定义更多,如有向图网络(Directed Graphs and Networks)、无向图网络(Undirected)等概念。
Graph在现实世界中随处可见,如交通运输图、旅游图、流程图等。此处我们只考虑由点和线所组成的图。
利用图可以描述现实生活中的许多事物,如用点可以表示交叉口,点之间的连线表示路径,这样就可以轻而易举的描绘出一个交通运输网络。
1.1.2、Graph的结构
根据Graph的定义,一个Graph包含一个节点集合和一个边集。
在NetworkX中,一个节点可以是任意hash对象(除了None对象),一条边也可以关联任意的对象,像一个文本字符串,一幅图像,一个XML对象,甚至是另一个图或任意定制的节点对象。
注意:Python中的None对象是不可以作为节点的类型的。
节点与边能够存储任意类型字典的属性和任意其他丰富类型的数据。
1.1.3、Graph分类
- Graph:指无向图(undirected Graph),即忽略了两节点间边的方向。
- DiGraph:指有向图(directed Graph),即考虑了边的有向性。
- MultiGraph:指多重无向图,即两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联。
- MultiDiGraph:多重图的有向版本。
G = nx.Graph() # 创建无向图G = nx.DiGraph() # 创建有向图G = nx.MultiGraph() # 创建多重无向图G = nx.MultiDigraph() # 创建多重有向图G.clear() #清空图
2、基本操作
2.1、无向图
- 节点 如果添加的节点和边是已经存在的,是不会报错的,NetworkX会自动忽略掉已经存在的边和节点的添加。
import networkx as nx
import matplotlib.pyplot as plt
plt.switch_backend('agg')
G = nx.Graph() #建立一个空的无向图G
G.add_node('a') #添加一个节点1
nx.draw(G, with_labels=True)
plt.show()#显示一个点a
G.add_nodes_from(['b','c','d','e']) #加点集合
nx.draw(G, with_labels=True)
plt.show()
G.add_cycle(['f','g','h','j']) #加环
nx.draw(G, with_labels=True)
plt.show()
H = nx.path_graph(10)
G.add_node(H) #直接将图作为节点
nx.draw(G, with_labels=True)
plt.show()
G.add_cycle(['ff','fg','fh','fj']) #加环
nx.draw(G, with_labels=True)
plt.show()
H = nx.path_graph(10) #返回由10个节点挨个连接的无向图,所以有9条边
G.add_nodes_from(H) #创建一个子图H加入G
nx.draw(G, with_labels=True)
plt.show()
#访问节点
print('图中所有的节点', G.nodes())
print('图中节点的个数', G.number_of_nodes())
#删除节点
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()
#访问边
print('图中所有的边', F.edges())
print('图中边的个数', F.number_of_edges())
#快速遍历每一条边,可以使用邻接迭代器实现,对于无向图,每一条边相当于两条有向边
FG = nx.Graph()
FG.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])
for n, nbrs in FG.adjacency():for nbr, eattr in nbrs.items():data = eattr['weight']print('(%d, %d, %0.3f)' % (n,nbr,data))print('***********************************')#筛选weight小于0.5的边:
FG = nx.Graph()
FG.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])
for n, nbrs in FG.adjacency():for nbr, eattr in nbrs.items():data = eattr['weight']if data < 0.5:print('(%d, %d, %0.3f)' % (n,nbr,data))
print('***********************************')
#一种方便的访问所有边的方法:
for u,v,d in FG.edges(data = 'weight'):print((u,v,d))
#删除边
F.remove_edge(1,2)
F.remove_edges_from([(11,12), (13,14)])
nx.draw(F, with_labels=True)
plt.show()
- 属性
属性诸如weight,labels,colors,或者任何对象,你都可以附加到图、节点或边上。
对于每一个图、节点和边都可以在关联的属性字典中保存一个(多个)键-值对。
默认情况下这些是一个空的字典,但是我们可以增加或者是改变这些属性。
#图的属性import networkx as nx import matplotlib.pyplot as pltG = nx.Graph(day='Monday') #可以在创建图时分配图的属性 print(G.graph)G.graph['day'] = 'Friday' #也可以修改已有的属性 print(G.graph)G.graph['name'] = 'time' #可以随时添加新的属性到图中 print(G.graph)
#节点的属性G = nx.Graph(day='Monday') G.add_node(1, index='1th') #在添加节点时分配节点属性 print(G.node(data=True))G.node[1]['index'] = '0th' #通过G.node[][]来添加或修改属性 print(G.node(data=True))G.add_nodes_from([2,3], index='2/3th') #从集合中添加节点时分配属性 print(G.nodes(data=True))print(G.node(data=True))
#边的属性G = nx.Graph(day='manday') G.add_edge(1,2,weight=10) #在添加边时分配属性 print(G.edges(data=True))G.add_edges_from([(1,3), (4,5)], len=22) #从集合中添加边时分配属性 print(G.edges(data='len'))G.add_edges_from([(3,4,{'hight':10}),(1,4,{'high':'unknow'})]) print(G.edges(data=True))G[1][2]['weight'] = 100000 #通过G[][][]来添加或修改属性 print(G.edges(data=True))
注意:
注意什么时候使用‘=’,什么时候使用‘:’;什么时候有引号什么时候没有引号。
特殊属性weight应该是一个数值型的,并且在算法需要使用weight时保存该数值。
python中的networkx库相关推荐
- python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码
python中nlp的库 by Praveen Dubey 通过Praveen Dubey 单词词汇入门以及如何在Python中为NLP 编写代码的简介 (An introduction to Bag ...
- python中的迭代库
python中的迭代库为itertools,如果需要输出详细,需要使用类型工厂函数,如list,tuple将结果转换 itertools.product:product(A,B) 相当于((x, y) ...
- python中调用c库
python中调用c库 2013-04-23 15:34:52| 分类: python核心编程 | 标签:python makefile |举报 |字号 订阅 参考地址:http://my. ...
- Python中第三方的库(library)、模块(module),包(package)的安装方法以及ImportError: No module named...
Python中,想要安装第三方安装包,即third library,package等,对于熟悉的人来说,很简单. 但是对于新手,至少对于之前的我,很难,往往只是安装一个很小的包,都被搞得一头雾水. 现 ...
- python中nlp的库_用于nlp的python中的网站数据清理
python中nlp的库 The most important step of any data-driven project is obtaining quality data. Without t ...
- 利用python中的csv库读写csv文件
利用python中的csv库读写csv文件 python读写csv文件就我知道的方法有:1)利用csv库,2)利用读写txt文件的方式处理,3)利用numpy或pandas库处理 在这篇博客中,博主就 ...
- 用python中的turtle库绘制一些有趣的图
最近有个在读大学的女生,想要我帮忙用python画几个图,在画的过程中觉得有些图还挺有意思的,分享给大家. 1 图1 第一个图是蚊香,感兴趣的小伙伴可以自己尝试在python中用turtl ...
- python中的sheet,Python中的Smartsheet库:模块'smartsheet.sheets'没有属性'sheets'
我正在尝试在python中使用smartsheet库. 使用'$ pip install smartsheet-python-sdk'完成pip安装. 我使用以下代码在令牌上进行了测试. import ...
- python中使用requests库获取昵图网图片,且正则中re.S的用法
python中使用requests库获取图片,且正则表达式中re.S的用法以及r.text和r.content的区别和搜索关键词 这里我获取的是昵图网的图片 代码附上 这里我获取的是2020的图片 i ...
最新文章
- 线程池运用不当的一次线上事故
- python常用英语单词-python – 获取英语单词的基本形式
- ElasticSearch之动态映射和模板
- c++ 异步下获取线程执行结果_这份阿里技术官强推的java线程池笔记,建议你看一下
- java 字符串缓冲区_详解Java中字符串缓冲区StringBuffer类的使用
- 从Waymo挖来感知负责人张一萌,以及Pony.ai的又半年
- MpscGrowableArrayQueue分析
- 【转】C#字符串转换为日期
- 图像和视频语义分割的深度学习技术综述
- 中文翻译The Django Book
- 颜色代码大全 - RGB颜色查询对照表
- 走近分形与混沌(part5)--洛伦茨与吸引子
- 为什么计算机连不上无线网络,电脑总是连不上无线怎么回事
- 银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点
- 【前端部署】vue项目打包并部署到Linux服务器
- PyCharm连接MySQL数据库的时候,驱动下载失败
- 【博客418】cpu平坦模型和分段模型
- structural covariance network
- 牛客寒假算法基础集训营6 I-wzoi
- CF1169C. Increasing by Modulo(二分)