最近在学习图相关的东西,networks真的是个神器,在不追求特别高效率的情况下,简直是不能再方便了,简单记录下心得。
一、基础知识
(一)数据结构
数据结构在很大程度上决定了图计算的效率,用了有一段时间的python了,要说效率那一定是dict了,英雄所见略同,networks的数据结构也是一系列的dict的嵌套。
{'A': {'B': {5}}, 'C': {'B': {3}}, 'B': {'A': {2}, 'C': {1}}}
第一个的含义:A-B权重为5。
当然,第三层括号里还可以继续嵌套新的字典存别的值,这里不展开说了。
(二)图的类型
目前networks支持四种类型的图
(1)无向图——Graph
(2)有向图——DiGraph
(3)多路径无向图——MultiGraph
(4)多路径有向图——MultiDiGraph
二、用法
(一)创建图、添加边
import networkx as nx
G = nx.Graph() #初始化一个无向图
G.add_edge(1, 2) # 增加一条边,没有指认权重,则默认为1
G.add_edge(2, 3, weight=0.9) # 增加边并指定权重为0.9
#一次增加多条边
elist = [(1, 2), (2, 3), (1, 4), (4, 2)]
G.add_edges_from(elist)
elist = [('a', 'b', 5.0), ('b', 'c', 3.0), ('a', 'c', 1.0), ('c', 'd', 7.3)]
G.add_weighted_edges_from(elist)
其他类型的图也是一样的方法创建,具体请参考官方文档
(二)求图的一些基本属性
#节点和边相关方法
G.number_of_nodes() #节点数量
G.number_of_edges() #边的数量
list(G.nodes) #返回所有节点
list(G.edges) #返回所有边
neighbors(G, n) #n所有的邻节点
#求节点度
G.degree() #所有点的节点度
G.degree([1,2]) #某一个或者多个节点的节点度
degree_histogram(G) #返回节点度的频率分布
#求邻节点平均节点度
average_neighbor_degree(G) #返回每个节点的邻接点平均节点度
# 聚类系数
clustering(G) #返回每个节点的局部聚类系数
average_clustering(G) #返回整个图所有节点的平均局部聚类系数
(三)最短路径
#判断两个点之间是否存在路径
has_path(G, source, target)
#求两个点之间的最短路径
shortest_path(G, source=None, target=None, weight=None, method='dijkstra')
参数:
G 图
source 如果不指定,则为图中所有可能为起点的节点
target 如果不指定,则为图中所有可能为终点的节点
weight 如果未指定,所有边的权重全默认为1
method 默认为dijkstra最短路径算法,也可指定为bellman-ford。如果是无权图,则会使用无向图的相关算法
暂时先说这一些吧,其官方说明文档说的特别详细,有需要的可以自己去瞅瞅:
https://networkx.github.io/documentation/stable/index.html