介绍
NetworkX是一款Python的软件包,用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。
有了NetworkX你就可以用标准或者不标准的数据格式加载或者存储网络,它可以产生许多种类的随机网络或经典网络,也可以分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。
如果在此之前你还不太了解Python,戳这里——>python新手教程
安装
其实如果要用NetworkX来进行复杂网络的编程还离不开许多相关的其他Python库,我们可以去官网根据需求一一安装,networkx官网有详细的安装说明。这里推荐一种超级方便实用的方法,即安装Anaconda,Anaconda包含了许多实用的常用Python库,你就不需要再一一自己安装了。请参考这里。(Anaconda是跨平台的Windows和Linux都支持)
基本使用
(下面实验如果没有特殊说明,都是在Ubuntu下使用Visual Studio Code实验的)
创建一个图
首先创建一个空的图import networkx as nx G = nx.Graph()
根据图的定义,一个图包含一个节点集合和一个边集。在NetworkX中,节点可以是任何哈希对象,像一个文本字符串,一幅图像,一个XML对象,甚至是另一个图或任意定制的节点对象。(注意,Python中的None对象是不可以作为节点的类型的。)
节点
图G可以通过好几种方式生成。NetworkX包含了许多图的产生函数和一些读写图的工具。我们可以通过一些简单的操作开始
最简单的我们一次添加一个节点:G.add_node(1)
也可以从一个list中添加节点:
G.add_nodes_from([2, 3])
或者从nbunch中添加节点,nbunch是任何可迭代的节点容器(如list、set、graph、file等),nbunch本身不是图中的一个节点。
H=nx.path_graph(10) #H是一个有10个节点的链状图,即有n个节点n-1条边的连通图 G.add_nodes_from(H) #或者G.add_nodes_from(H.nodes())
此时图G中就包含了图H中的10个节点。作为比较,我们可以使图H作为图G的一个节点:
G.add_node(H)
现在图G就包含了一个节点H,即该节点是一个图。可以看到这种灵活性是非常强大的,它允许图的图,文件的图,函数的图等等。因此我们应该好好思考如何构建我们的应用程序才能使我们的节点是有用的实体。当然我们可以在图中使用一个唯一的标识符或者使用一个不同的字典的键来标识节点信息。(如果该hash依赖于它的内容,则我们不应该改变节点对象)
边
一个图G可以通过一次添加一条边来构成:G.add_edge(1,2) #等价于 e=(1,2) #e是一个元组 G.add_edge(*e) #这是python中解包裹的过程
也可以通过添加list来添加多条边:
G.add_edges_from([(1,2),(1,3)])
或者通过添加任何ebunch来添加边,一个ebunch是任何可迭代的边的元组,一个边的元组可以是两个节点之间的一个2元组(无权值的边)或者3元组(3元组还有一个元素是边的权值,比如(1,2,{‘weight’:100}))。下面将进一步讨论边的属性:
G.add_edges_from(H.edges()) #不能写作G.add_edges_from(H)
我们可以用类似的方法拆除图:
G.remove_node(),G.remove_nodes_fro