networkx-图的实战利器

    最近在学习图相关的东西,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

猜你喜欢

转载自blog.csdn.net/dick2737/article/details/83818703
今日推荐