汐月教育之Networkx包 学习笔记
来源:互联网 发布:设置数据有效性 编辑:程序博客网 时间:2024/05/16 18:40
作者:JUDGE_MENT
邮箱:gao19920804@126.com
CSDN博客:http://blog.csdn.NET/sinat_23137713
最后编辑时间:2017.3.2 V1.1
声明:
1)该翻译是本人在学习NetworkX时,看到官方教程很简单清楚,所以稍微总结,当作阅读笔记
2)本文仅供学术交流,非商用。
3)本人才疏学浅,难免出错,还望各位大牛悉心指正。
4)转载请注明出处。
简介:
NetworkX是一个Python语言软件包,用于创建,操纵和研究复杂网络的结构,动力学和功能。
使用NetworkX,您可以以标准和非标准数据格式加载和存储网络,生成许多类型的随机和经典网络,分析网络结构,构建网络模型,设计新的网络算法,绘制网络等。
对于本人来说,用networkx分析网络太low了,但是我可以用它来当python中图的数据结构,比自己再从头定义好很多。
官方教程:
http://networkx.readthedocs.io/en/networkx-1.11/tutorial/index.html
一. 创建图
1. 引入头文件:
>>> import networkx as nx2. 创建图:
>>> G=nx.Graph() #创建空图3. 添加节点
>>> G.add_node(1)>>> G.add_nodes_from([2,3])
>>> H=nx.path_graph(10)
>>> G.add_nodes_from(H)
>>> G.add_node(H)
4. 添加边
>>> G.add_edge(1,2)>>> e=(2,3)
>>> G.add_edge(*e) # unpack edge tuple*
>>> G.add_edges_from([(1,2),(1,3)])
>>> G.add_edges_from(H.edges())
5. 删除节点和边
>>> G.remove_node(H)>>> G.clear()
>>> G.remove_nodes_from("spam")
>>> G.nodes()
[1, 2, 3, 'spam']
>>> G.remove_edge(1,3)
二. 查看图
1. 基本查看
>>> G.number_of_nodes()>>> G.number_of_edges()
>>> G.nodes()
>>> G.edges()
>>> G.edges_iter()) :迭代获取边,不用创建大型list.
>>> non_edges(G): 迭代获取没有连接的那些边
>>> G.neighbors(1)>>> for n,nbrs in FG.adjacency_iter(): 邻接迭代器
2. 下标查看
>>> G[1] : 返回节点1连接连接的所有连接的点>>> G[1][2] : 返回节点1和节点2连接的属性
3. 下标查看属性
G[1][3]['color']4. 迭代器查看
>>> for n,nbrs in FG.adjacency_iter():... for nbr,eattr in nbrs.items():
... data=eattr['weight']
... if data<0.5: print('(%d, %d, %.3f)' % (n,nbr,data))
迭代器中的n是所有的节点,从小到大;nbrs是该节点的所有邻居;所以无向图中每条边会出现两次。
for (u,v,d) in FG.edges(data='weight'):
... if d<0.5: print('(%d, %d, %.3f)'%(n,nbr,d))
或者这么迭代,但是需要用到edges,对于过大的图应该不行
三. 添加属性
1. 添加图属性
>>> G = nx.Graph(day="Friday") #创建时添加>>> G.graph['day']='Monday' #后期修改
>>> G.graph # 查看图属性
2. 节点属性
>>> G.add_node(1, time='5pm') # 创建节点时,添加属性>>> G.add_nodes_from([3], time='2pm')
>>> G.node[1]['room'] = 714 # 节点已经存在之后,添加属性
3. 边属性
>>> G.add_edge(1, 2, weight=4.7 ) # 创建边时,添加属性>>> G.add_edges_from([(3,4),(4,5)], color='red')
>>> G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
>>> G[1][2]['weight'] = 4.7 # 边已经存在之后,添加属性
>>> G.edge[1][2]['weight'] = 4
注意‘weight’属性一定要是数字格式
四. 特殊的图
1. 有向图
1)创建图:
>>> G=nx.DiGraph() #创建空有向图2)添加
>>> DG.add_weighted_edges_from([(1,2,0.5), (3,1,0.75)])3)有向图多了一些新属性
>>> DG.out_degree(1,weight='weight')>>> DG.degree(1,weight='weight')
>>> DG.successors(1)
>>> DG.neighbors(1)
4)转换为无向图(很多函数针对无向图的,你要想使用它需要先将有向图转换为无向图再说)
>>> Graph.to_undirected() # 两种方法转换>>> H = nx.Graph(G) # convert G to undirected graph
2. 多边图
两个节点之间可以有多个边1)创建图:
>>> G=nx.MultiGraph() #创建空多边图>>> G=nx.MultiDiGraph() #创建空多边有向图
2)多边图特定函数
MG.degree(weight='weight')3)很多函数不支持,如最短路径,必须要把多边图转换为普通图再计算
>>> GG=nx.Graph()>>> for n,nbrs in MG.adjacency_iter():
... for nbr,edict in nbrs.items():
... minvalue=min([d['weight'] for d in edict.values()])
... GG.add_edge(n,nbr, weight = minvalue)
>>> nx.shortest_path(GG,1,3)
[1, 2, 3]
五. 其他图生成器和图操作器
除了一条边一条边的生成,我们还有其他生成图的方式1. 一些函数
subgraph(G, nbunch) - 根据在nbunch中的节点生成G中的子图union(G1,G2) - 图的加法
disjoint_union(G1,G2) - 假设所有节点均不同的图加法
cartesian_product(G1,G2) - return Cartesian product graph
compose(G1,G2) - combine graphs identifying nodes common to both
complement(G) - graph complement
create_empty_copy(G) - return an empty copy of the same graph class
convert_to_undirected(G) - return an undirected representation of G
convert_to_directed(G) - return a directed representation of G
2. networkx自带一些经典图
>>> petersen=nx.petersen_graph()>>> tutte=nx.tutte_graph()
>>> maze=nx.sedgewick_maze_graph()
>>> tet=nx.tetrahedral_graph()
3. 使用图生成器:
生成器都有啥具体见: http://networkx.readthedocs.io/en/networkx-1.11/reference/generators.html>>> K_5=nx.complete_graph(5)
>>> K_3_5=nx.complete_bipartite_graph(3,5)
>>> barbell=nx.barbell_graph(10,10)
>>> lollipop=nx.lollipop_graph(10,20)
4. 随机图生成器:
>>> er=nx.erdos_renyi_graph(100,0.15)>>> ws=nx.watts_strogatz_graph(30,3,0.1)
>>> ba=nx.barabasi_albert_graph(100,5)
>>> red=nx.random_lobster(100,0.9,0.9)
5. 导入文件中的图
支持格式(如边列表,邻接表,GML,GraphML,pickle,LEDA等)读取存储在文件中的图形。竟然支持GraphML,我白写了个转换脚本了。>>> nx.write_gml(red,"path.to.file")
>>> mygraph=nx.read_gml("path.to.file")
具体见,连接 http://networkx.readthedocs.io/en/networkx-1.11/reference/readwrite.html
六. 分析图
G的结构可以使用各种图形理论函数来分析,例如:nx.connected_components(G) # 分析图内有有哪几个连接着的区域
nx.clustering(G) # 聚类
1. 查看节点的度
nx.degree(G)# 查看每个节点的度
>>> nx.degree(G,1)
2
>>> G.degree(1)
2
>>> G.degree([1,2])
{1: 2, 2: 1}
>>> sorted(G.degree([1,2]).values())
[1, 2]
>>> sorted(G.degree().values())
[0, 1, 1, 2]
2. 判断两个节点是否连接?
>>> def nodes_connected(u, v):
... return u in G.neighbors(v)
...
>>> nodes_connected("a", "d")
False
>>> nodes_connected("a", "c")
True
3. 寻找两个节点间路径
太重要了 nx.all_simple_path(G, source, target , cutoff)
七. 绘图
networkx 并不是主要用来绘图的包,画出来肯定不好看,如果想画好看的,可以去git上找一找。画出来的图大概这样:
绘图链接: http://networkx.readthedocs.io/en/networkx-1.11/reference/drawing.html
- 汐月教育之Networkx包 学习笔记
- igraph/networkx学习笔记之…
- NetworkX学习笔记(1)
- NetworkX学习笔记-4-NetworkX输出Gephi文件的方法
- NetworkX学习笔记-5-NetworkX输出Gephi文件的方法
- 汐月教育之理解TensorFlow(七)tensorflow_fold的学习
- networkx笔记
- networkx笔记
- NetworkX学习笔记-2-基本使用方法举例
- 复杂网络分析库NetworkX学习笔记2
- python学习笔记(2)--Networkx画图
- NetworkX学习笔记——基本功能使用
- networkx学习笔记1:网络图创建
- python 学习笔记2 --画图(networkx)
- 【Python】python 学习笔记 --画图(networkx)
- networkx使用笔记(一)之安装篇
- networkx使用笔记(二)之小试牛刀篇
- networkx学习
- Leetcode-515. Find Largest Element in Each Row
- Linux下搭建Tomcat服务器
- HDU2070
- Linux系统默默改变了人类世界的生活方式
- Linux shell脚本编程之函数
- 汐月教育之Networkx包 学习笔记
- 读《推荐系统实践》(1)——基础
- CentOS 6配置SFTP
- UI自动化测试学习笔记:Espresso (一) BasicSample
- 【CF#612E】Square Root of Permutation 置换群
- C++对c的扩展
- Activity启动过程分析
- 蓝桥杯 新建Microsoft Word文档
- bzoj 2286 SDOI2011 消耗战 虚树dp