汐月教育之Networkx包 学习笔记

来源:互联网 发布:设置数据有效性 编辑:程序博客网 时间:2024/05/16 18:40

作者:JUDGE_MENT

邮箱:gao19920804@126.com

CSDN博客:http://blog.csdn.NET/sinat_23137713

最后编辑时间:2017.3.2  V1.1

声明:

1)该翻译是本人在学习NetworkX时,看到官方教程很简单清楚,所以稍微总结,当作阅读笔记

2)本文仅供学术交流,非商用。

3)本人才疏学浅,难免出错,还望各位大牛悉心指正。

4)转载请注明出处。



简介:
NetworkX是一个Python语言软件包,用于创建,操纵和研究复杂网络的结构,动力学和功能。
使用NetworkX,您可以以标准和非标准数据格式加载和存储网络,生成许多类型的随机和经典网络,分析网络结构,构建网络模型,设计新的网络算法,绘制网络等。
对于本人来说,用networkx分析网络太low了,但是我可以用它来当python中图的数据结构,比自己再从头定义好很多。

官方教程:
http://networkx.readthedocs.io/en/networkx-1.11/tutorial/index.html


一. 创建图

1. 引入头文件:

    >>> import networkx as nx

2. 创建图:

>>> G=nx.Graph()  #创建空图

3. 添加节点

>>> G.add_node(1)
>>> G.add_nodes_from([2,3])
>>> H=nx.path_graph(10)
>>> G.add_nodes_from(H)
>>> G.add_node(H)

4. 添加边

>>> G.add_edge(1,2)
>>> e=(2,3)
>>> G.add_edge(*e) # unpack edge tuple*
>>> G.add_edges_from([(1,2),(1,3)])
>>> G.add_edges_from(H.edges())

5. 删除节点和边

>>> G.remove_node(H)
>>> G.clear()
>>> G.remove_nodes_from("spam")
>>> G.nodes()
[1, 2, 3, 'spam']
>>> G.remove_edge(1,3)

二. 查看图

1. 基本查看

>>> G.number_of_nodes()
>>> G.number_of_edges()
>>> G.nodes()
>>> G.edges()

>>> G.edges_iter()) :迭代获取边,不用创建大型list. 

>>> non_edges(G): 迭代获取没有连接的那些边

>>> G.neighbors(1)
>>> for n,nbrs in FG.adjacency_iter(): 邻接迭代器

2. 下标查看

>>> G[1]      : 返回节点1连接连接的所有连接的点
>>> G[1][2]   : 返回节点1和节点2连接的属性

3. 下标查看属性

G[1][3]['color']

4. 迭代器查看

>>> for n,nbrs in FG.adjacency_iter():
...    for nbr,eattr in nbrs.items():
...        data=eattr['weight']
...        if data<0.5: print('(%d, %d, %.3f)' % (n,nbr,data))
迭代器中的n是所有的节点,从小到大;nbrs是该节点的所有邻居;所以无向图中每条边会出现两次。
for (u,v,d) in FG.edges(data='weight'):
...     if d<0.5: print('(%d, %d, %.3f)'%(n,nbr,d))
或者这么迭代,但是需要用到edges,对于过大的图应该不行

三. 添加属性

1. 添加图属性

>>> G = nx.Graph(day="Friday")  #创建时添加
>>> G.graph['day']='Monday'   #后期修改
>>> G.graph    # 查看图属性

2. 节点属性

>>> G.add_node(1, time='5pm')   # 创建节点时,添加属性
>>> G.add_nodes_from([3], time='2pm')
>>> G.node[1]['room'] = 714 # 节点已经存在之后,添加属性

3. 边属性

>>> G.add_edge(1, 2, weight=4.7 )          # 创建边时,添加属性
>>> G.add_edges_from([(3,4),(4,5)], color='red')
>>> G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
>>> G[1][2]['weight'] = 4.7   # 边已经存在之后,添加属性
>>> G.edge[1][2]['weight'] = 4
注意‘weight’属性一定要是数字格式

四. 特殊的图

1. 有向图

1)创建图:

>>> G=nx.DiGraph()  #创建空有向图

2)添加

>>> DG.add_weighted_edges_from([(1,2,0.5), (3,1,0.75)])

3)有向图多了一些新属性

>>> DG.out_degree(1,weight='weight')
>>> DG.degree(1,weight='weight')
>>> DG.successors(1)
>>> DG.neighbors(1)

4)转换为无向图(很多函数针对无向图的,你要想使用它需要先将有向图转换为无向图再说)

>>> Graph.to_undirected()   # 两种方法转换
>>> H = nx.Graph(G) # convert G to undirected graph

2. 多边图

两个节点之间可以有多个边

1)创建图:

>>> G=nx.MultiGraph()  #创建空多边图
>>> G=nx.MultiDiGraph()  #创建空多边有向图

2)多边图特定函数

MG.degree(weight='weight') 

3)很多函数不支持,如最短路径,必须要把多边图转换为普通图再计算

>>> GG=nx.Graph()
>>> for n,nbrs in MG.adjacency_iter():
...    for nbr,edict in nbrs.items():
...        minvalue=min([d['weight'] for d in edict.values()])
...        GG.add_edge(n,nbr, weight = minvalue)
>>> nx.shortest_path(GG,1,3)
[1, 2, 3]

五. 其他图生成器和图操作器

除了一条边一条边的生成,我们还有其他生成图的方式

1. 一些函数

subgraph(G, nbunch)      - 根据在nbunch中的节点生成G中的子图
union(G1,G2)             - 图的加法
disjoint_union(G1,G2)    - 假设所有节点均不同的图加法
cartesian_product(G1,G2) - return Cartesian product graph
compose(G1,G2)           - combine graphs identifying nodes common to both
complement(G)            - graph complement
create_empty_copy(G)     - return an empty copy of the same graph class
convert_to_undirected(G) - return an undirected representation of G
convert_to_directed(G)   - return a directed representation of G

2. networkx自带一些经典图

>>> petersen=nx.petersen_graph()
>>> tutte=nx.tutte_graph()
>>> maze=nx.sedgewick_maze_graph()
>>> tet=nx.tetrahedral_graph()

3. 使用图生成器:

生成器都有啥具体见: http://networkx.readthedocs.io/en/networkx-1.11/reference/generators.html
>>> K_5=nx.complete_graph(5)
>>> K_3_5=nx.complete_bipartite_graph(3,5)
>>> barbell=nx.barbell_graph(10,10)
>>> lollipop=nx.lollipop_graph(10,20)

4. 随机图生成器:

>>> er=nx.erdos_renyi_graph(100,0.15)
>>> ws=nx.watts_strogatz_graph(30,3,0.1)
>>> ba=nx.barabasi_albert_graph(100,5)
>>> red=nx.random_lobster(100,0.9,0.9)

5. 导入文件中的图

支持格式(如边列表,邻接表,GML,GraphML,pickle,LEDA等)读取存储在文件中的图形。竟然支持GraphML,我白写了个转换脚本了。
>>> nx.write_gml(red,"path.to.file")
>>> mygraph=nx.read_gml("path.to.file")
具体见,连接 http://networkx.readthedocs.io/en/networkx-1.11/reference/readwrite.html

六. 分析图

G的结构可以使用各种图形理论函数来分析,例如:
nx.connected_components(G) # 分析图内有有哪几个连接着的区域
nx.clustering(G) # 聚类

1. 查看节点的度

nx.degree(G)# 查看每个节点的度
>>> nx.degree(G,1)
2
>>> G.degree(1)
2
>>> G.degree([1,2])
{1: 2, 2: 1}
>>> sorted(G.degree([1,2]).values())
[1, 2]
>>> sorted(G.degree().values())

[0, 1, 1, 2]

2. 判断两个节点是否连接?

>>> def nodes_connected(u, v):

...     return u in G.neighbors(v)

... 

>>> nodes_connected("a", "d")

False

>>> nodes_connected("a", "c")

True

3. 寻找两个节点间路径

太重要了 nx.all_simple_path(G, source, target , cutoff)

七. 绘图

networkx 并不是主要用来绘图的包,画出来肯定不好看,如果想画好看的,可以去git上找一找。

画出来的图大概这样:


绘图链接: http://networkx.readthedocs.io/en/networkx-1.11/reference/drawing.html 


0 0
原创粉丝点击