初识Python之Networkx模块

初识Python之Networkx模块

文章目录

    • 初识Python之Networkx模块
      • 简介
      • 安装Networkx
      • 导入模块、查看版本信息
      • 一些基本操作
        • 创建Graph
        • 添加边(节点)
        • 获取Graph的基本信息
        • Graph的基本绘图
      • 简单应用案例
        • 使用内置的Graph数据
        • 创建一个无向图
        • 创建一个有向图
        • 在计算机网络中的应用案例
        • 在数据中心里的应用案例

简介

本文主要介绍Networkx的使用方法和一些简单的应用案例,使用方法主要会介绍创建图、图的基本操作等;应用案例不仅会介绍如何生成无向图、有向图等,还会介绍Networkx在计算机网络、数据中心网络等网络中的简单应用案例。

安装Networkx

在cmd或者shell中输入命令:

pip install networkx

如果使用python中的.ipynb的话也可以:

%pip install networkx

导入模块、查看版本信息

import networkx as nx
import matplotlib.pyplot as plt
print(nx.__version__)

在这里插入图片描述

一些基本操作

创建Graph
G = nx.Graph()          # 无向图
G = nx.DiGraph()        # 有向图
G = nx.MultiGraph()     # 多重无向图
G = nx.MultiDigraph()   # 多重有向图
G.clear()               # 清空图
添加边(节点)

在添加边的时候,如果使用了未添加的节点,则会自动添加节点。另外单纯添加节点的方法是:

# 添加节点
G.add_node(1)
G.add_nodes_from([2, 3, 4])
G.add_edge(1, 2)             # default edge data=1
G.add_edge(2, 3, weight=0.9) # specify edge data
# 如果是边有许多的权,比如有长度和宽度的属性,那么:
G.add_edge(n1, n2, length=2, width=3)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)# 如果给结点的名称是其它符号,想离散化成从x开始的数字标记,那么:
G = nx.convert_node_labels_to_integers(G, first_label=x)
获取Graph的基本信息
nx.info(G) # 图信息的概览
G.number_of_nodes()
G.number_of_edges()
# 获取和节点idx连接的边的attr属性之和
G.in_degree(idx, weight='attr')# 如果想知道某个结点相连的某个边权之和:
DG.degree(nodeIdx, weight='weightName')# 获取结点或者边的属性集合,返回的是元组的列表
G.nodes.data('attrName')
G.edges.data('attrName')# 获取n1 n2的边的length权重,那么:
G[n1][n2]['length']
# 如果是有重边的图,选择n1,n2第一条边的length权重,则:
G[n1][n2][0]['length']# 获取n1结点的所有邻居
nx.all_neighbors(G, n1)# 判断图中n1到n2是否存在路径
nx.has_path(G, n1, n2)
# 根据一个结点的list,获取子图
subG = nx.subgraph(G, nodeList)
Graph的基本绘图
# 最简单的绘制
import matplotlib.pyplot as plt
nx.draw(G)
plt.show()# 设置其他相关参数
nx.draw(G,with_labels=True,pos = nx.sprint_layout(G),node_color=color_list,edge_color='k',node_size=100,node_shape='o',linewidths=2,width=1.0,alpha=0.55,style='solid',font_size=9,font_color='k'
)

简单应用案例

使用内置的Graph数据
G = nx.karate_club_graph()
plt.figure(figsize =(10, 8))
nx.draw_networkx(G, with_labels = True)

在这里插入图片描述

创建一个无向图
# 创建一个无向图
G = nx.Graph()# 添加节点
G.add_node(1)
G.add_nodes_from([2, 3, 4])# 添加边
G.add_edge(1, 2)
G.add_edges_from([(1, 3), (2, 4), (3, 4)])# 绘制图形
nx.draw(G, with_labels=True, font_weight='bold')
plt.show()# 输出图的基本信息
print("图中的节点:", G.nodes())
print("图中的边:", G.edges())
print("节点 1 的邻居:", list(G.neighbors(1)))

在这里插入图片描述
在这里插入图片描述

创建一个有向图
# 创建一个有向图
DiG = nx.DiGraph()# 添加节点
DiG.add_node(1)
DiG.add_nodes_from([2, 3, 4])# 添加有向边
DiG.add_edge(1, 2)
DiG.add_edges_from([(1, 3), (2, 4), (3, 4)])# 绘制图形
nx.draw(DiG, with_labels=True, font_weight='bold', arrowsize=20, node_size=700)
plt.show()# 输出有向图的基本信息
print("有向图中的节点:", DiG.nodes())
print("有向图中的有向边:", DiG.edges())
print("节点 1 的出度:", DiG.out_degree(1))
print("节点 1 的入度:", DiG.in_degree(1))

在这里插入图片描述
在这里插入图片描述

在计算机网络中的应用案例
# 创建一个有向图表示网络拓扑
G = nx.DiGraph()# 添加节点和边
G.add_nodes_from(["Router1", "Router2", "Switch1", "Computer1"])
G.add_edges_from([("Router1", "Router2"), ("Router1", "Switch1"), ("Switch1", "Computer1")])# 绘制网络拓扑
nx.draw(G, with_labels=True, font_weight='bold', arrowsize=20, node_size=700)
plt.show()# 计算节点度
degrees = dict(G.degree())
print("节点度:", degrees)# 计算聚类系数
clustering_coefficient = nx.clustering(G)
print("聚类系数:", clustering_coefficient)# 计算最短路径
shortest_path = nx.shortest_path(G, source="Router1", target="Computer1")
print("最短路径:", shortest_path)# 绘制带权重的有向图
nx.draw(G, with_labels=True, font_weight='bold', arrowsize=20, node_size=700, connectionstyle='arc3,rad=0.1')
plt.show()# 查找所有最短路径
all_shortest_paths = list(nx.all_shortest_paths(G, source="Router1", target="Computer1"))
print("所有最短路径:", all_shortest_paths)# 计算路径长度
path_length = nx.shortest_path_length(G, source="Router1", target="Computer1")
print("最短路径长度:", path_length)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在数据中心里的应用案例
import networkx as nx
import matplotlib.pyplot as plt
import random# 创建一个有向图表示网络拓扑
network_topology = nx.DiGraph()# 添加节点和边
network_topology.add_nodes_from(["Router1", "Router2", "Switch1", "Link1"])
network_topology.add_edges_from([("Router1", "Switch1"), ("Router2", "Switch1"), ("Switch1", "Link1")])# 添加边属性表示流量和权重
network_topology["Switch1"]["Link1"]["traffic"] = 0
network_topology["Switch1"]["Link1"]["threshold"] = 50
network_topology["Switch1"]["Link1"]["weight"] = 1.0# 模拟拥塞控制算法
def congestion_control(network, threshold):for edge in network.edges(data=True):# 检查键是否存在,如果不存在则初始化if "traffic" not in edge[2]:edge[2]["traffic"] = 0edge[2]["traffic"] += random.randint(0, 20)  # 模拟随机流量增加if edge[2]["traffic"] > threshold:# 执行拥塞控制动作edge[2]["weight"] = 2.0  # 增加拥塞链路的权重else:edge[2]["weight"] = 1.0  # 恢复非拥塞链路的权重# 模拟多个时间步的拥塞控制
for i in range(5):congestion_control(network_topology, threshold=network_topology["Switch1"]["Link1"]["threshold"])print(f"时间步 {i + 1} - Link1 流量:{network_topology['Switch1']['Link1']['traffic']}")# 绘制带权重的有向图
edge_weights = [edge[2]["weight"] for edge in network_topology.edges(data=True)]
nx.draw(network_topology, with_labels=True, font_weight='bold', arrowsize=20, node_size=700, edge_color=edge_weights, cmap=plt.cm.Blues)
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285886.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinuxCNC系统安装

首先我们需要准备一个U盘来安装系统,然后进入Debian官网。操作系统处,点击“下载Debian”。 如果需要下载其他比较全版本,可以点击“其他下载链接”,选择DVD的安装,因为是国外的网站,最好不要选择网络安装。…

MSDN:Mutually Semantic Distillation Network for Zero-Shot Learning 中文版 待更新

摘要 零样本学习(ZSL)的关键挑战是如何将潜在的语义知识融合在可见类的视觉特征和抽象特征之间,从而实现向不可见类的横向知识转移。之前的工作要么只是将图像的全局特征与其相关的类语义向量对齐,要么利用单向注意力来学习有限的…

【Linux基础】3. 文件基本属性

文章目录 【 1. 文件的属主和属组 】【 2. 显示文件的类型、权限 】2.1 文件类型2.2 文件权限 【 3. 更改文件属性 】3.1 chgrp 更改文件属组3.2 chown 更改文件所有者3.3 更改文件权限3.3.1 数字法更改文件权限3.3.2 符号法更改文件权限 【 1. 文件的属主和属组 】 Linux 系统…

CentOS:Docker容器中安装vim

在使用docker容器时,里边没有安装vim时,敲vim命令时提示说:vim: command not found 这个时候就须要安装vim,安装命令: apt-get install vim 出现以下错误: 解决方法: apt-get update 这个命令的…

EMC测试与整改实践?|深圳比创达电子

电磁兼容(EMC)测试和整改是当今社会对电磁兼容(EMC)意识日益深入的表现,EMC测试与整改随着社会对电磁环境要求的不断提高,越来越受到重视,下面就EMC测试与整改实践进行一下详细介绍。 一、什么是EMC测试? EMC测试是指在一定的电…

RPC(3):HttpClient实现RPC之GET请求

1HttpClient简介 在JDK中java.net包下提供了用户HTTP访问的基本功能,但是它缺少灵活性或许多应用所需要的功能。 HttpClient起初是Apache Jakarta Common 的子项目。用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 H…

Nginx快速入门:Nginx应用场景、安装与部署(一)

1. Nginx简介 Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个非常流行的开源 Web 服务器软件。它是由俄罗斯程序员 Igor Sysoev 开发的,最初是为了解决在高并发场景下的C10k 问题(即一个服务器进程只能处理 10,000 个并发连接&#x…

计算机论文写作助手

本人原创AI应用,现有公开,体验一下

基于hfl/rbt3模型的情感分析学习研究——文本挖掘

参考书籍《HuggingFace自然语言处理详解 》 什么是文本挖掘 文本挖掘(Text mining)有时也被称为文字探勘、文本数据挖掘等,大致相当于文字分析,一般指文本处理过程中产生高质量的信息。高质量的信息通常通过分类和预测来产生&…

数字经济如何驱动企业高质量发展? ——核心机制、模式选择与推进路径

文章目录 每日一句正能量前言核心机制信息化和智能化作为数字经济的核心机制信息化和智能化如何提升企业生产效率和管理水平数据的获取、分析和利用对企业发展的影响 模式选择电子商务模式的选择共享经济模式的选择数据驱动的业务模式选择 推进路径建设数字化基础设施培养数字化…

驭见大模型 智领新征程丨泰迪智能科技荣登2023年度广东省人工智能应用项目风云榜

12月15日,由广东省科学技术厅、广东省工业和信息化厅、广东省人力资源和社会保障厅、广东省政务服务数据管理局、广东省科学技术协会指导,广东省人工智能产业协会主办的2023年粤港澳大湾区人工智能产业大会正式举办,大会以“驭见大模型、智领…

【深度思考】现在学JAVA还有饭吃吗?

Java语言:在新时代中的地位探讨 Java的时代变迁 自1995年诞生以来,Java已走过了27年的历程。曾经作为编程界的佼佼者,Java的一些曾被誉为前瞻的设计理念,在今日看来或许已不再显得那么突出,甚至显得有些落后。例如&a…