学校组织数学建模比赛,两次模拟练习都需要用到图这个工具,但是自己还没到能随便码出求最短路径的函数,一直都用matlab里面的graphshortestpath函数来求。当遇到要求处理300多对结点的最短路径问题,用matlab可以实现,不过我对matlab半路出家,只是在会调用函数而已,处理字符串、写函数对于我来说好难好难啊!于是网上各种搜,最终找到Python有自己的网络学习的包-Networkx,如遇知己,相见恨晚!
网上好像关于这个包的用法介绍并不多,为了以后工作方便,打算自己学习一下这个库,同时也放上来给对图处理感觉很棘手的小伙伴们抛一个砖吧。
本文只是这个库的一个tutorial,所有内容都是通过直接查看Network的官方文档翻译过来的。
官方介绍是:
NetworkX is a Pythonlanguage software package for the creation, manipulation, and study of thestructure, dynamics, and functions of complex networks.
- 用来处理无向图、有向图、多重图的Python数据结构
- 包含许多标准的图算法
- 包括网络结构和分析方法
- 用于产生经典图、随机图和综合网络
- 节点可以是任何事物(如text, images, XML records)
- 边能保存任意起算值(如weights, time-series)
- 开源证书 BSD license
- 很好的测试结果:超过1800个单元测试,90%的结点覆盖
- 从Python获得的额外优势:快速原型开发方法,容易学,支持多平台。
下面给上连接:
下载链接:
Source and binary releases: http://cheeseshop.python.org/pypi/networkx/
Github (latest development): https://github.com/networkx/networkx/
官方文档:
https://networkx.readthedocs.io/en/stable/index.html
创建图
import networkx as nx
G=nx.Graph()
#Graph是结点(向量)与确定的结点对(称作边、链接等)的集合。在Networkx中,结点可以是任何可哈希的对象,
#如文本字符串、图片、XML对象、其他图,自定义对象等。(注意,Python的None对象不应该用作结点,)
#可哈希的:一个对象在它的生存期从来不会被改变(拥有一个哈希方法),能和其他对象区别(有比较方法)
结点
用很多方法来生成。Neatworkx包含很多图生成器函数和工具,可用来以多种格式来读写图。
#我们来看一些简单的操作。
#一次增加一个节点:
G.add_node(1)
#用序列增加一系列的节点
G.add_nodes_from([2,3])
#增加 nbunch结点。 nbunch是可迭代的结点容器 (序列、集合、图、文件等),其本身不是图的某个节点
H=nx.path_graph(10)#type(H) networkx.classes.graph.Graph
G.add_nodes_from(H)#这是将H中的许多结点作为G的节点
G.add_node(H)#这是将H作为G中的一个节点
#查看结点
G.node #字典 {0: {}, 1: {}, 2: {}, 3: {},4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}}
. . .
边
#G能够一次增加一条边
G.add_edge(1,2) #只能增加边,有属性,除非指定属性名和值“属性名=值”
e=(2,3)
G.add_edge(*e) #注意! G.add_edge(e)会报错!G.add_edge(e)
#用序列增加一系列结点
G.add_edges_from([(1,2),(1,3)])
#增加 ebunch边。ebunch:包含边元组的容器,比如序列、迭代器、文件等
#这个元组可以是2维元组或 三维元组 (node1,node2,an_edge_attribute_dictionary),an_edge_attribute_dictionary比如:
#{‘weight’:3.1415}
G.add_edges_from(H.edges())
删除
G.remove_node(),G.remove_nodes_from()
G.remove_edge(),G.remove_edges_from()
G.remove_node(H) #删除不存在的东西会报错
#移除所有的节点和边
G.clear()
G.add_edges_from([(1,2),(1,3)])
G.add_node(1)
G.add_edge(1,2)
G.add_node("spam")
G.add_nodes_from("spam") # adds 4 nodes: 's', 'p', 'a', 'm'
G.edges(),G.nodes(),G.number_of_edges(),G.number_of_nodes()
还有很多使用方法,有向图创建,绘图等功能简介,详见ipynb文件:
http://pan.baidu.com/s/1kVtuh2v
http://download.csdn.net/detail/yuexiaomao/9621045