[Python]networkx入门

来源:互联网 发布:vb贪吃蛇代码 编辑:程序博客网 时间:2024/05/17 01:17

目录(?)[-]

  1. 1安装
    1. setuptools
    2. easy_install
    3. pip
    4. 安装networkx
  2. 2使用
    1. 建图
    2. 访问
    3. 属性
    4. 图算法
    5. 画图
networkx是python的一个第三方包,可以方便地调用各种图算法的计算。
通过调用python画图包matplotlib能实现图的可视化。

1.安装


正好整理一下python第三方包的安装方法。

setuptools

使用setuptools包,我们能够手动下载,安装第三方包。
使用方式:
下载第三方包源文件,在setup.py目录下执行
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. python XX install  

easy_install

easy_install工具,自动化地根据第三方包的名称,一键联网搜索,下载并且调用setuptools安装。
使用方式:
上网下载ez_setup.py文件,执行
python ez_setup.py安装setuptools工具。
执行
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. easy_install SQLObject   
安装第三方包

pip

与easy_install类似,根据名称一键下载,调用setuptools安装。pip是可以看作是easy_install的升级版。
使用方式:
通过 http://www.jsxubar.info/install-pip.html
先下载get-pip.py文件
运行python get-pip.py,自动安装,包括setuptools在内的包
使用:
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. pip install simplejson --安装包  
  2. pip install --upgrade simplejson --升级包  
  3. pip uninstall simplejson --卸载包  

使用setuptools自助下载安装,经常会遇到包确实,没有制定编译器等等各种问题而导致安装失败。所以使用easy_install或者pip是比较方便的选择。

安装networkx

安装networkx之前要安装画图工具matplotlib,以及矩阵运算工具numpy,于是我们执行:
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. pip install numpy  
  2. pip install matplotlib  
  3. pip install networkx  
安装完成。

2.使用

networkx的英文版说明可以在其官方网站上下载得到,写的简单易懂。
http://networkx.github.io/documentation/latest/reference/index.html 

这里记录下一些简单的建图方法。
在networkx中,图以对象的形式提供借口。
在图对象中,还有点,边等也是以对象形式提供,画图则调用matplotlib的函数完成。

建图

networkx可以建立简单无向图graph,有向图digraph,可重复边的multi-graph。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import networkx as nx  
  2. G=nx.Graph()  
  3. D=nx.DiGraph()  
  4. M=nx.MultiGraph()  

这里的点可以是任意可区分的对象(hashable),比如数字,字符串,对象等。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. G.add_node(1)  
  2. G.add_node('first_node')  
  3. #这里用一个对象多为key来唯一区别一个点  
  4. #我们还能够用一个列表来批量加入点  
  5. G.add_nodes_from([1,2,3])  
  6. #还可以用一个图对象作为点,嵌入到其他图中  
  7. G.add_node(D) #这里D作为一个点的key  
  8. #或者把一个图的所有点赋予另一个图  
  9. G.add_nodes_from(D) #这里返回D的所有点,赋予G  
  10. #与加入相同的传递方法,我们也可以删除点  
  11. G.remove_node(1)  
  12. G.remove_nodes_from([1,2,3])  

这里的边可以使用两个单独的对象作为输入
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. G.add_edge(1,2#表示1,2之间有一条边。  
  2. #如果不存在点1,2,则会自动加入点集合。  
  3. #或者以元组的形式作为输入  
  4. e=(1,2)  
  5. G.add_edge(*e)  
  6. #这里的*代表吧元组解包(unpack),当作一个个的值扔到函数中去。  
  7. #如果不解包,等价于  
  8. #G.add_edge(e)=G.add_edge((1,2))与参数传递的方式不符。  
  9. #类似的,我们还可以使用包含元组的列表来传递参数  
  10. G.add_edges_from([(1,2),(2,3)])  
  11. #我们还可以报一个图的边赋予另一个图  
  12. G.add_edges_from(H)  
  13. #删除  
  14. G.remove_edge(1,2)  
  15. G.remove_edges_from([(1,2),(2,3)])  

访问

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. node_list = G.nodes()  
  2. edge_list = G.edges()  
  3. #可以返回包含点与边的列表  
  4. node = G.node[‘first_node’]  
  5. #如上根据key返回点  
  6. edge = G.edge['first_node']['second_node']  
  7. #同样的方法,返回两个key之间的边  

属性

我们可以给图,点,边赋予各种属性,最简单的就是权值属性
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. G.add_node(1,time='5pm')  
  2. #在添加时跟上属性  
  3. G.add_nodes_from([1,2,3],time='5pm')  
  4. #批量添加点是,跟上统一的属性  
  5. G.add_nodes_from([(3,{'time':'5pm'}), (4,{'time':'4pm'})])  
  6. #或者写成元组列表[(key,dict),(key,dict)]的形式  
  7. G.node[1]['time']  
  8. #根据字典key访问属性值。  
  9.   
  10. #给边添加属性也类似  
  11. G.add_edge(1,2,time='3am')  
  12. G.add_edges_from([(1,2,{'time'='5pm'}),(2,3,{'time'=3am})])  
  13. #批量赋予属性  
  14. G.edge[1][2][‘time’]  
  15. #访问  
  16.   
  17. #我们还可以使用特定的函数批量返回属性,如  
  18. time = nx.get_edge_attributes(G,'time')  
  19. #返回得到以元组为key,time属性为值得一个字典  
  20. time[(1,2)]  

图算法

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. nx.connected_components(G)  
  2. #返回列表形式的G的全连通分量,每个分量一个子列表  
类似的,networkx还提供各种图算法,具体可见官方文档。

画图

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. nx.draw(G) #画出图G  
  2. matplotlib.show() #显示出来  

我们使用连通分量算法,并画出一个简单的图如下:

networkx的默认属性效果并不好,我们根据文档提供的借口设置合适的属性,才能得到合适的图。
networkx提供图的点位置,大小,颜色,形状,边的颜色,类型等属性可设置。

0 0
原创粉丝点击