【python】networkx包对图相关操作

news/2024/9/23 2:39:30/

NetworkX 是一个用于创建、操作和研究复杂网络的结构、动态和功能的 Python 包。它提供了丰富的数据结构和函数,便于处理和网络。下面是 NetworkX 包的一些主要功能:

  1. 的创建与操作

    • 支持多种类型的(无向、有向、多重、加权等)。
    • 可以方便地添加、删除节点和边。
    • 支持许多论算法,如最短路径、网络流、圈检测等。
  2. 的测量与分析

    • 提供多种的中心性测量方法,如度中心性、接近中心性、介数中心性等。
    • 支持社区检测、小世界网络检测等高级网络分析功能。
    • 能够计算的直径、密度、连通性等属性。
  3. 的可视化

    • 虽然 NetworkX 本身的可视化功能有限,它可以与其他库(如 Matplotlib)配合,来创建形的视觉表示。
    • 支持定制节点和边的样式、布局等。
  4. 与数据结构的兼容性

    • 可以从多种数据格式导入和导出,如边列表、邻接矩阵、GEXF、GraphML、Pickle等。
    • 方便与 Pandas 和 NumPy 等数据处理库配合使用,进行数据分析和处理。
  5. 算法支持

    • 包括经典的论算法,例如 Dijkstra、Floyd-Warshall、Prim、Kruskal 等。
    • 支持更复杂的结构如生成树、网络流、路径算法等。

这些功能使得 NetworkX 成为在学术研究和实际应用中分析和可视化网络数据的有力工具。

目录

networkx%E6%A8%A1%E5%9D%97%E5%AE%89%E8%A3%85%E5%92%8C%E8%B0%83%E7%94%A8-toc" style="margin-left:0px;">一、networkx模块安装和调用

二、使用

生成

读取

获取的点与边

获取点的邻居与权重

 判断是否存在节点/边

修改

添加/删除节点

添加/删除边

为边添加权重

graph的node节点重新编号


networkx%E6%A8%A1%E5%9D%97%E5%AE%89%E8%A3%85%E5%92%8C%E8%B0%83%E7%94%A8">一、networkx模块安装和调用

python">pip install networkx  
import networkx as nx

二、使用

生成

生成主要有 nx.DiGraph 有向和 nx.Graph 无向两种,除了的不同外,边可以区分为有权重和无权重,下面介绍生成带权重有向的方法,无向和无权重可以参考类似生成方法。

python">import networkx as nx
import randomdef createGraph():f = open(edge_file, "w")for i in range(node_num):node_from = random.randint(0, 1000)node_to = random.randint(0, 1000)weight = random.random()if node_from != node_to:f.write("%s %s %s\n" % (node_from, node_to, weight))f.close()# 1.构造
edge_file = "graph_edge.txt"
node_num = 1000
createGraph()

这里随机生成一些测试数据,node_from 和 node_to 分别代表起始点,createGraph 方法会生成约 node_num 条带权重边,示例如下,起始点已经通过数字标识,权重通过 float 的形式给出: 

读取

上述方法生成了的模拟节点,下面通过 nx.read_edgelist 方法读取的边与权重,node_from 和 node_to 为节点,create_using 选择 nx.DiGraph 则为有向,选择 nx.Graph 则为无向,nodetype 可以选择None,也可以选择对应类型,例如 int 等等,data 为我们对边的附属描述,这里第三列我们规定其为 float 类型的 weight。

python">def loadGraph(fileName):G = nx.read_edgelist(fileName, create_using=nx.DiGraph(), nodetype=None, data=[('weight', float)])return GG = loadGraph(edge_file)

获取的点与边

G.nodes() 获取中全部点,number_of_nodes() 获取中顶点的数量,可以通过 for 循环遍历 nodes,也可以通过 list(G.nodes()) 包装执行其他的迭代操作。

G.edges() 获取中全部边,如果需要显示边的附加信息,例如上例中我们添加了 weight 选项,data=Teue 则可以保证信息全部打印,G.number_of_edges() 获取全部边的数量。

python">print("节点和边的个数:", G.number_of_nodes(), G.number_of_edges())
# # 获取路网的每条节点/边属性信息
print("节点和边:", list(G.nodes(data=True))[0], list(G.edges(data=True))[0])

获取点的邻居与权重

获取相关顶点的邻居,可以通过 nx 的 neighbors 方法获取对应顶点的邻居以及与对应邻居的权重(如果有)。

python"># 4.获取节点邻居
for node in G.nodes:nbrs = list(G.neighbors(node))weights = []for nbr in nbrs:weights.append(G[node][nbr]["weight"])print("节点", node, "的邻居:", nbrs, "对应权重", weights)break

 判断是否存在节点/边

Graph.has_edge(uv),其中参数: u, v (节点) ,返回值:如果有边则返回True,否则返回False。

python"># 判断是否存在
print(G.has_node('221'))
print(G.has_edge('221', '5221'))

 

修改

通过上面的操作,已经可以从基础的数据中生成并获取的顶点与边,接下来需要对进行微调,则需要增删改查的方法,下面介绍常用的方法:

添加/删除节点

可以一次添加一个节点,或从任何 iterable 容器,如列表

python"># 添加/删除 节点
G.add_node('10')
G.add_nodes_from(['1', '2', '3'])  # 批量添加
G.remove_node('10')
G.remove_nodes_from(['1', '2', '3'])  # 批量删除

添加/删除边

G 也可以通过一次添加一个边来生长,或者通过添加边列表,

python"># 添加/删除 边
G.add_edge('1', '2')
G.add_edges_from([('1', '2'), ('3', '4')])  # 批量添加
G.remove_edge('1', '2')
G.remove_edges_from([('1', '2'), ('3', '4')])  # 批量删除

为边添加权重

python"># 为边添加权重
G.add_edge('1', '2')
G.edges['1', '2']['weight'] = 0.33

graph的node节点重新编号

python">import networkx as nx# 创建一个示例
G = nx.DiGraph()
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5)])# 创建一个新的节点编号映射字典
new_node_labels = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}# 使用relabel_nodes重新编号节点
H = nx.relabel_nodes(G, new_node_labels)# 输出重新编号后的
print("Original Graph:")
print(G.nodes)
print(G.out_degree())
print("Graph after relabeling nodes:")
print(H.nodes)
print(H.out_degree())


http://www.ppmy.cn/news/1449997.html

相关文章

C语言——操作符保姆级教学(含整形提升及算数转换)

操作符 一.操作符的分类二.原码、反码、补码三.移位操作符1.左移操作符&#xff1a;<<2.右移操作符&#xff1a;>> 四.位操作符1.按位与—— &2.按位或—— |3.按位异或—— ^4.按位取反—— ~ 五.逗号表达式六.条件操作符七.操作符的属性&#xff1a;优先级、…

AQS解密:深入理解 CountDownLatch, Semaphore 和 CyclicBarrier

1. AQS&#xff08;AbstractQueuedSynchronizer&#xff09;框架简介 AQS是java.util.concurrent.locks包中的一个抽象类&#xff0c;是实现同步器&#xff08;如锁和其他多线程同步工具&#xff09;的一个框架。Doug Lea设计了这个框架&#xff0c;旨在让开发者通过使用其提供…

【力扣】203、环形链表 II

142. 环形链表 II 要解决这道题&#xff0c;首先需要对问题进行拆解&#xff1a; 确定链表是否存在环确定环的入口点 如何判断是否存在环呢&#xff1f;这个比较容易想到&#xff0c;使用快慢指针即可判断链表是否存在环。我们定义两个指针&#xff1a; ListNode slow head…

随便聊一下 显控科技 控制屏 通过 RS485 接口 上位机 通讯 说明

系统搭建&#xff1a; 1、自己研发的一个小系统&#xff08;采集信号&#xff0c;将采集的信号数字化&#xff09;通过COM口&#xff0c;连接显控屏 COM3 口采用 485 协议送到显控屏&#xff08;显控科技&#xff09;的显示屏展示出来&#xff09;。 2、显控屏 将 展示的数据…

深度学习之基于YOLOv5智慧交通拥挤预警检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加速和人口规模的不断增长&#xff0c;交通拥挤问题日益严重。传统的交通拥挤预警方…

Servlet详解(从xml到注解)

文章目录 概述介绍作用 快速入门Servelt的执行原理执行流程&#xff1a;执行原理 生命周期概述API 服务器启动&#xff0c;立刻加载Servlet对象(理解)实现Servlet方式(三种)实现Servlet接口实现GenericServlet抽象类&#xff0c;只重写service方法实现HttpServlet实现类实现Htt…

精准测试-Vue前端调用链影响变更分析之一

Vue前端调用链影响变更分析之一 一、背景二、工具调研1、 工具介绍&#xff1a;2、工具使用 三、工具落地集成方案&#xff08;待后续补充&#xff09;变更影响较为简单的实现变更影响较为复杂的实现1、全局关系数据库的构建2、变更影响的简单实现3、变更影响的复杂实现 一、背…

LuaJIT源码分析(三)字符串

LuaJIT源码分析&#xff08;三&#xff09;字符串 要表示一个字符串&#xff0c;核心就是需要知道字符串的长度&#xff0c;以及存放字符串具体数据的地址。lua的字符串是内化不可变的&#xff0c;也就是lua字符串变量存放的不是字符串的拷贝&#xff0c;而是字符串的引用。那么…