1、python复杂网络分析库NetworkXpython 复杂网络分析库 NetworkX阅读目录无向图有向图加权图经典图论算法计算强连通、弱连通子图条件过滤pred , succNetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复 杂网络 分析算法 ,可以方便的进行复杂网络数据分析、 仿真建模等工作。 networkx 支持创 建简单无向图、有向图和多重图( multigraph );内置许多标准的图论算法,节点可为任 意数据;支持任意的边值维度,功能丰富,简单易用。引入模块import networkx as nxprint nx回到顶部无向图例 1
2、 :#!-*- coding:utf8-*-import networkx as nx import matplotlib.pyplot as pltprint number of edges: , G.number_of_edges() #输出边的数量: 1 nx.draw(G) plt.savefig( wuxiangtu.png )plt.show()输出1nodes: 1, 2, 32edges: (2, 3)3number of edges: 1例 2 :#-*- coding:utf8-*-#加点 #加点集合#加环#加边集合import networkx as nx import
3、matplotlib.pyplot as plt G = nx.DiGraph() G.add_node(1) G.add_node(2) G.add_nodes_from(3,4,5,6) G.add_cycle(1,2,3,4) G.add_edge(1,3) G.add_edges_from(3,5),(3,6),(6,7) nx.draw(G) plt.savefig( youxiangtu.png ) plt.show()回到顶部 有向图 例 1 :#!-*- coding:utf8-*-import networkx as nximport matplotlib.pyplot as
4、 pltG = nx.DiGraph()G.add_node(1)G.add_node(2)G.add_nodes_from(3,4,5,6)G.add_cycle(1,2,3,4) G.add_edge(1,3)G.add_edges_from(3,5),(3,6),(6,7) nx.draw(G)plt.savefig( youxiangtu.png )plt.show()注:有向图和无向图可以互相转换,使用函数:Graph.to_undirected()Graph.to_directed()例 2 ,例子中把有向图转化为无向图:#!-*- coding:utf8-*- import ne
5、tworkx as nx import matplotlib.pyplot as pltG = nx.DiGraph()G.add_node(1)G.add_node(2)G.add_nodes_from(3,4,5,6)G.add_cycle(1,2,3,4)G.add_edge(1,3)G.add_edges_from(3,5),(3,6),(6,7)G = G.to_undirected()nx.draw(G)plt.savefig( wuxiangtu.png )plt.show()注意区分以下 2 例例 3-1#-*- coding:utf8-*-import networkx as
6、 nximport matplotlib.pyplot as pltG = nx.DiGraph()road_nodes = a : 1, b : 2, c : 3 #road_nodes = a:1:1, b:2:2, c:3:3 road_edges = ( a , b ), ( b , c )G.add_nodes_from(road_nodes.iteritems() G.add_edges_from(road_edges)nx.draw(G)plt.savefig( youxiangtu.png ) plt.show()例 3-2#-*- coding:utf8-*-import n
7、etworkx as nximport matplotlib.pyplot as pltG = nx.DiGraph()#road_nodes = a: 1, b: 2, c: 3 road_nodes = a :1:1, b :2:2, c :3:3 road_edges = ( a , b ), ( b , c )G.add_nodes_from(road_nodes.iteritems() G.add_edges_from(road_edges)nx.draw(G)plt.savefig( youxiangtu.png )plt.show()回到顶部edges_from ,它接 w 是权
8、重。#建立一个空的无#添加一条边 2-3加权图有向图和无向图都可以给边赋予权重, 用到的方法是 add_weighted 受 1 个或多个三元组 u,v,w 作为参数,其中 u 是起点, v 是终点, 例 1 :#!-*- coding:utf8-*- import networkx as nximport matplotlib.pyplot as pltG = nx.Graph() 向图 G G.add_edge(2,3) (隐含着添加了两个节点 2、3) G.add_weighted_edges_from(3, 4, 3.5),(3, 5, 7.0) #对于无向图,边 3-2 与边 2-3
9、 被认为是一条边print G.get_edge_data(2, 3)print G.get_edge_data(3, 4)print G.get_edge_data(3, 5) nx.draw(G)plt.savefig( wuxiangtu.png ) plt.show()输出 weight : 3.5回到顶部经典图论算法计算计算 1 :求无向图的任意两点间的最短路径# -*- coding: cp936 -*- import networkx as nx import matplotlib.pyplot as plt #计算 1:求无向图的任意两点间的最短路径G = nx.Graph()
10、G.add_edges_from(1,2),(1,3),(1,4),(1,5),(4,5),(4,6),(5,6)path = nx.all_pairs_shortest_path(G)print path1计算 2 :找图中两个点的最短路径import networkx as nxG=nx.Graph()G.add_nodes_from(1,2,3,4)G.add_edge(1,2)G.add_edge(3,4)try :n=nx.shortest_path_length(G,1,4)print nexcept nx.NetworkXNoPath:print No path回到顶部 强连通、
11、弱连通强连通:有向图中任意两点 v1 、 v2 间存在 v1 到 v2 的路径( path )及 v2 到 v1 的 路径。弱联通:将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。距离例 1 :弱连通#-*- coding:utf8-*-import networkx as nximport matplotlib.pyplot as plt#G = nx.path_graph(4, create_using=nx.Graph()#0 1 2 3G = nx.path_graph(4, create_using=nx.DiGraph
12、() #默认生成节点 0 1 23,生成有向变 0-1,1-2,2-3G.add_path(7, 8, 3) #生成有向边: 7-8-3for c in nx.weakly_connected_components(G):print cprint len(c) for c in sorted(nx.weakly_connected_components(G), key=len, reverse=True)nx.draw(G)plt.savefig( youxiangtu.png )plt.show()执行结果set(0, 1, 2, 3, 7, 8)6例 2 :强连通#-*- coding:u
13、tf8-*-import networkx as nx import matplotlib.pyplot as plt#G = nx.path_graph(4, create_using=nx.Graph()#0 1 2 3G = nx.path_graph(4, create_using=nx.DiGraph() G.add_path(3, 8, 1)#for c in nx.strongly_connected_components(G):# print c#print len(c) for c in sorted(nx.strongly_connected_components(G),
14、key=len, reverse=True)con = nx.strongly_connected_components(G) print conprint type(con)print list(con)nx.draw(G)plt.savefig( youxiangtu.png )plt.show()执行结果 set(8, 1, 2, 3), set(0)回到顶部 子图#-*- coding:utf8-*-import networkx as nximport matplotlib.pyplot as pltG = nx.DiGraph()G.add_path(5, 6, 7, 8)sub_
15、graph = G.subgraph(5, 6, 8)#sub_graph = G.subgraph(5, 6, 8) #ok 一样nx.draw(sub_graph)plt.savefig( youxiangtu.png ) plt.show()回到顶部 条件过滤# 原图#-*- coding:utf8-*-import networkx as nximport matplotlib.pyplot as pltG = nx.DiGraph() road_nodes = a : id :1, b : id :1, c : id :3, d : id :4 road_edges = ( a ,
16、b ), ( a , c ), ( a , d ), ( b , d )G.add_nodes_from(road_nodes)G.add_edges_from(road_edges) nx.draw(G)plt.savefig( youxiangtu.png ) plt.show()# 过滤函数#-*- coding:utf8-*- import networkx as nximport matplotlib.pyplot as pltG = nx.DiGraph()def flt_func_draw():flt_func = lambda d: d id != 1return flt_fu
17、ncroad_nodes = a : id :1, b : id :1, c : id :3, d : id :4 road_edges = ( a , b ), ( a , c ), ( a , d ), ( b , d )G.add_nodes_from(road_nodes.iteritems() G.add_edges_from(road_edges)flt_func = flt_func_draw()part_G = G.subgraph(n for n, d in G.nodes_iter(data=True) if flt_func(d) nx.draw(part_G)plt.s
18、avefig( youxiangtu.png )plt.show()回到顶部pred , succ#-*- coding:utf8-*-import networkx as nximport matplotlib.pyplot as pltG = nx.DiGraph()road_nodes = a : id : 1, b : id :1, c : id :3road_edges = ( a , b ), ( a , c ), ( c , d )G.add_nodes_from(road_nodes.iteritems()G.add_edges_from(road_edges)print G.
19、nodes()print G.edges()printas pred , G.preda printbs pred , G.predb printcs pred , G.predc printds pred , G.predd printas succ , G.succa printbs succ , G.succbprintcs succ , G.succcprintds succ , G.succdnx.draw(G)plt.savefig( wuxiangtu.png ) plt.draw()结果1a,c, b, d2(a,c), (a, b), (c,d)34as pred5bs preda: 6cs preda: 7ds predc: 89as succc: , b: 10bs succ11cs succd: 12ds succ
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1