word完整版python复杂网络分析库NetworkX.docx
《word完整版python复杂网络分析库NetworkX.docx》由会员分享,可在线阅读,更多相关《word完整版python复杂网络分析库NetworkX.docx(14页珍藏版)》请在冰豆网上搜索。
word完整版python复杂网络分析库NetworkX
python复杂网络分析库NetworkX
阅读目录
∙无向图
∙有向图
∙加权图
∙经典图论算法计算
∙强连通、弱连通
∙子图
∙条件过滤
∙pred,succ
NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。
networkx支持创建简单无向图、有向图和多重图(multigraph);内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用。
引入模块
importnetworkxasnx
printnx
回到顶部
无向图
例1:
#!
-*—coding:
utf8—*-
importnetworkxasnx
importmatplotlib.pyplotasplt
G=nx.Graph()#建立一个空的无向图G
G。
add_node
(1)#添加一个节点1
G。
add_edge(2,3)#添加一条边2—3(隐含着添加了两个节点2、3)
G.add_edge(3,2)#对于无向图,边3—2与边2—3被认为是一条边
print”nodes:
",G.nodes()#输出全部的节点:
[1,2,3]
print”edges:
",G。
edges()#输出全部的边:
[(2,3)]
print”numberofedges:
”,G。
number_of_edges()#输出边的数量:
1
nx。
draw(G)
plt.savefig("wuxiangtu。
png")
plt。
show()
输出
1
2
3
nodes:
[1,2,3]
edges:
[(2,3)]
numberofedges:
1
例2:
#—*—coding:
utf8—*—
importnetworkxasnx
importmatplotlib.pyplotasplt
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-*-
importnetworkxasnx
importmatplotlib。
pyplotasplt
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()
注:
有向图和无向图可以互相转换,使用函数:
∙Graph.to_undirected()
∙Graph.to_directed()
例2,例子中把有向图转化为无向图:
#!
—*—coding:
utf8—*-
importnetworkxasnx
importmatplotlib.pyplotasplt
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)])
G=G.to_undirected()
nx.draw(G)
plt。
savefig("wuxiangtu。
png")
plt.show()
注意区分以下2例
例3-1
#-*-coding:
utf8-*-
importnetworkxasnx
importmatplotlib。
pyplotasplt
G=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—*-
importnetworkxasnx
importmatplotlib。
pyplotasplt
G=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()
回到顶部
加权图
有向图和无向图都可以给边赋予权重,用到的方法是add_weighted_edges_from,它接受1个或多个三元组[u,v,w]作为参数,其中u是起点,v是终点,w是权重。
例1:
#!
—*-coding:
utf8-*-
importnetworkxasnx
importmatplotlib.pyplotasplt
G=nx。
Graph()#建立一个空的无向图G
G.add_edge(2,3)#添加一条边2—3(隐含着添加了两个节点2、3)
G。
add_weighted_edges_from([(3,4,3。
5),(3,5,7。
0)])#对于无向图,边3—2与边2—3被认为是一条边
printG。
get_edge_data(2,3)
printG。
get_edge_data(3,4)
printG.get_edge_data(3,5)
nx。
draw(G)
plt.savefig("wuxiangtu。
png")
plt.show()
输出
{}
{'weight’:
3。
5}
{’weight':
7.0}
回到顶部
经典图论算法计算
计算1:
求无向图的任意两点间的最短路径
#—*—coding:
cp936-*—
importnetworkxasnx
importmatplotlib。
pyplotasplt
#计算1:
求无向图的任意两点间的最短路径
G=nx。
Graph()
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)
printpath[1]
计算2:
找图中两个点的最短路径
importnetworkxasnx
G=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)
printn
exceptnx。
NetworkXNoPath:
print'Nopath’
回到顶部
强连通、弱连通
∙强连通:
有向图中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径.
∙弱联通:
将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图.如果一个有向图的基图是连通图,则有向图是弱连通图.
距离
例1:
弱连通
#—*—coding:
utf8—*-
importnetworkxasnx
importmatplotlib。
pyplotasplt
#G=nx。
path_graph(4,create_using=nx。
Graph())
#0123
G=nx.path_graph(4,create_using=nx。
DiGraph())#默认生成节点0123,生成有向变0-〉1,1->2,2—〉3
G。
add_path([7,8,3])#生成有向边:
7-〉8-〉3
forcinnx。
weakly_connected_components(G):
printc
print[len(c)forcinsorted(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:
utf8—*-
importnetworkxasnx
importmatplotlib。
pyplotasplt
#G=nx。
path_graph(4,create_using=nx.Graph())
#0123
G=nx.path_graph(4,create_using=nx。
DiGraph())
G.add_path([3,8,1])
#forcinnx。
strongly_connected_components(G):
#printc
#
#print[len(c)forcinsorted(nx.strongly_connected_components(G),key=len,reverse=True)]
con=nx.strongly_connected_components(G)
printcon
printtype(con)
printlist(con)
nx.draw(G)
plt。
savefig(”youxiangtu。
png")
plt。
show()
执行结果
〈type’generator’〉
[set([8,1,2,3]),set([0])]
回到顶部
子图
#-*—coding:
utf8-*-
importnetworkxasnx
importmatplotlib。
pyplotasplt
G=nx.DiGraph()
G。
add_path([5,6,7,8])
sub_graph=G.subgraph([5,6,8])