• NetworkX的基本用法


    一、前言

    NetworkX 是一个用于图计算的开源第三方库,常用如下缩写

    import networkx as nx
    
    • 1

    二、图、结点与边的创建/删除

    2.1 图的创建

    NetworkX 提供了四种类型的图,如下:

    在这里插入图片描述

    以无向图为例,创建它只需要

    G = nx.Graph()
    print(G)
    # Graph with 0 nodes and 0 edges
    
    • 1
    • 2
    • 3

    可以看出,使用这种方法创建的图是空图

    2.2 添加结点

    NetworkX 的结点可以是除了 None 以外的任何可哈希对象,例如字符串,数字,图像等(当然可以是另外一个 Graph 对象)。

    若要每次只添加一个结点,则可以使用 add_node 方法:

    G = nx.Graph()
    G.add_node(1)
    G.add_node('ABC')
    G.add_node(nx.Graph())
    print(G.number_of_nodes())  # 查看G中有多少个结点
    # 3
    print(G.nodes)
    # [1, 'ABC', ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    若要一次添加多个结点,则可以使用 add_nodes_from 方法(传入参数必须是可迭代容器):

    G = nx.Graph()
    G.add_nodes_from([1, 'ABC', nx.Graph()])
    print(G.nodes)
    # [1, 'ABC', ]
    
    • 1
    • 2
    • 3
    • 4
    G = nx.Graph()
    G.add_nodes_from("hello")
    print(G.nodes)  # 因为结点不可重复,所以最终只有4个结点
    # ['h', 'e', 'l', 'o']
    
    • 1
    • 2
    • 3
    • 4

    2.3 添加边

    同样,我们可以每次只添加一条边,这需要用到 add_edge 方法

    G = nx.Graph()
    G.add_edge(1, 2)  # 在结点1,2之间添加一条边
    print(G.edges)
    # [(1, 2)]
    print(G.nodes)
    # [1, 2]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以看出,在两个结点之间添加边时,若这两个结点在图中不存在,则会自动创建。

    若要一次性添加多个边,则需使用 add_edges_from 方法:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    print(G.nodes)
    # [0, 1, 2, 3]
    print(G.edges)
    # [(0, 1), (1, 2), (2, 3)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可视化:

    nx.draw(G, with_labels=True)
    
    • 1

    在这里插入图片描述

    2.4 删除结点

    删除单个结点:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2)])
    G.remove_node(1)
    print(G.edges)
    # []
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除多个结点:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    G.remove_nodes_from([1, 2])
    print(G.edges)
    # []
    print(G.nodes)
    # [0, 3]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.5 删除边

    删除单个边:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    G.remove_edge(1, 2)
    print(G.edges)
    # [(0, 1), (2, 3)]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除多条边:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    G.remove_edges_from([(0, 1), (2, 3)])
    print(G.edges)
    # [(1, 2)]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意,删除边并不会删除结点。

    三、图的相关计算

    图的邻接表:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    print(G.adj)
    # {0: {1: {}}, 1: {0: {}, 2: {}}, 2: {1: {}, 3: {}}, 3: {2: {}}}
    
    • 1
    • 2
    • 3
    • 4

    某个结点的所有邻居:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    nbr = G.neighbors(1)  # 返回一个迭代器
    print([n for n in nbr])
    # [0, 2]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意,G.neighbors(n)G.adj[n]G[n] 均可以访问结点 n n n 的邻居。

    判断结点和边是否存在:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    print(G.has_node(4))  # 等价于 4 in G
    # False
    print(G.has_edge(1, 2))
    # True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    求每个结点的度:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    print(G.degree)
    # [(0, 1), (1, 2), (2, 2), (3, 1)]
    
    • 1
    • 2
    • 3
    • 4

    计算有多少个结点和多少条边:

    G = nx.Graph()
    G.add_edges_from([(0, 1), (1, 2), (2, 3)])
    print(G.number_of_nodes())
    # 4
    print(G.number_of_edges())
    # 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    串口接收不定长数据的几种方法
    微服务框架 SpringCloud微服务架构 17 初识ES 17.1 什么是elasticsearch
    【报错】cannot import name ‘DistanceMetric‘ from ‘sklearn.metrics‘
    经验风险最小化与结构风险最小化:优化机器学习模型的两种方法
    tomcat的优化和tomcat和nginx实现动静分离:
    我们真的需要链式查询吗?
    cartographer_ros数据加载与处理
    PowerCLi VMware vCenter 通过自建的PXE Server一键批量部署常规New-VM
    项目(day02网站流量指标统计)
    如何使用baostock代码下载股票数据?
  • 原文地址:https://blog.csdn.net/raelum/article/details/125894091