Python 学习笔记之 networkx 使用

介绍 networkx

networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用

networkx 中的 Graph

Graph 的定义

Graph 是用点和线来刻画离散事物集合中的每对事物间以某种方式相联系的数学模型

网络作为图的一个重要领域,包含的概念与定义更多,如有向图网络、无向图网络等

Graph 在现实世界中随处可见,如交通运输图、旅游图、流程图等。此处我们只考虑由点和线所组成的图

Graph 的结构

一个 Graph 包含一个节点集合和一个边集

networkx 中,一个节点可以是任意 hash 对象(除了 None 对象),一条边也可以关联任意的对象,像一个文本字符串,一幅图像,一个 XML 对象,甚至是另一个图或任意定制的节点对象

总结 :

  1. Python 中的 None 对象是不可以作为节点的类型的
  2. networkx 中,节点与边能够存储任意类型字典的属性和任意其他丰富类型的数据

Graph 的分类

  • Graph:指无向图(undirected Graph),即忽略了两个节点间连边的方向
  • DiGraph:指有向图(directed Graph),即考虑了两个节点之间连边的有向性
  • MultiGraph:指多重无向图,即两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联(即允许重边和自环
  • MultiDiGraph:多重有向图
g = nx.Graph()  # 无向图
dg = nx.DiGraph()  # 有向图
mg = nx.MultiGraph()  # 多重无向图
mdg = nx.MultiDiGraph()  # 多重有向图
g.clear()  # 清空图

networkx 语法

节点操作

添加节点

如果添加的节点和边是已经存在的,是不会报错的, networkx 会自动忽略掉已经存在的边和节点的添加

import networkx as nx
import matplotlib.pyplot as pltG = nx.Graph()                 # 建立一个空的无向图G
G.add_node('a')                  # 添加一个节点a
G.add_nodes_from(['b','c','d','e'])    # 从一个列表中添加节点
H = nx.path_graph(10)          # 返回由10个节点挨个连接的无向图,有9条边
G.add_nodes_from(H)            # 创建一个子图H加入G
G.add_node(H)                  # 直接将图作为节点nx.draw(G, with_labels=True)
plt.show()print('图中所有的节点', G.nodes())
print('图中节点的个数', G.number_of_nodes())

图1

删除节点
# 删除节点
G.remove_node(1)    # 删除指定节点
G.remove_nodes_from(['b','c','d','e'])   # 删除列表中的节点
nx.draw(G, with_labels=True)
plt.show()

图2

边操作

添加边
# 添加边
F = nx.Graph()      # 创建无向图
F.add_edge(11,12)   # 指定节点之间添加一条边
# 等价于
e=(13,14)        # e 是一个元组
F.add_edge(*e)   # python 中解包的过程F.add_edges_from([(1,2),(1,3)])     # 通过 list 来添加多条边# 通过一个图的边来添加边
H = nx.path_graph(10)          # 返回由10个节点挨个连接的无向图,有9条边
F.add_edges_from(H.edges()) # 不能写作F.add_edges_from(H)nx.draw(F, with_labels=True)
plt.show()print('图中所有的边', F.edges())
print('图中边的个数', F.number_of_edges()) 

图3

遍历边
# 快速遍历每一条边,可以使用邻接迭代器实现,对于无向图,每一条边相当于两条有向边
G1 = nx.Graph()
G1.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])
for n, nbrs in G1.adjacency():for nbr, eattr in nbrs.items():data = eattr['weight']print('(%d, %d, %0.3f)' % (n,nbr,data))print('***********************************')# 筛选 weight 小于0.5的边:
G2 = nx.Graph()
G2.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])
for n, nbrs in G2.adjacency():for nbr, eattr in nbrs.items():data = eattr['weight']if data < 0.5:print('(%d, %d, %0.3f)' % (n,nbr,data))
print('***********************************')# 一种方便的访问所有边的方法:
for u,v,d in G2.edges(data = 'weight'):print((u,v,d))

输出:

(1, 2, 0.125)
(1, 3, 0.750)
(2, 1, 0.125)
(2, 4, 1.200)
(3, 1, 0.750)
(3, 4, 0.275)
(4, 2, 1.200)
(4, 3, 0.275)
***********************************
(1, 2, 0.125)
(2, 1, 0.125)
(3, 4, 0.275)
(4, 3, 0.275)
***********************************
(1, 2, 0.125)
(1, 3, 0.75)
(2, 4, 1.2)
(3, 4, 0.275)
删除边
# 删除边
F.remove_edge(1,2)
F.remove_edges_from([(11,12), (13,14)])nx.draw(F, with_labels=True)
plt.show()

属性操作

属性诸如 weight, labels, colors, 或者任何对象,你都可以附加到图、节点或边上。

对于每一个图、节点和边都可以在关联的属性字典中保存一个(多个)键-值对。

默认情况下这些是一个空的字典,但是我们可以增加或者是改变这些属性

# 图的属性
G = nx.Graph(day='Monday')    # 可以在创建图时分配图的属性
print(G.graph)
G.graph['day'] = 'Friday'     # 也可以修改已有的属性
print(G.graph)
G.graph['name'] = 'time'      # 可以随时添加新的属性到图中
print(G.graph)

输出:

{'day': 'Monday'}
{'day': 'Friday'}
{'day': 'Friday', 'name': 'time'}
# 节点的属性
G = nx.Graph(day='Monday')
G.add_node(1, index='1th')             # 在添加节点时分配节点属性
print(G.nodes(data=True))
G.nodes[1]['index'] = '0th'             # 通过G.nodes[][]来添加或修改属性
print(G.nodes(data=True))
G.add_nodes_from([2,3], index='2/3th')  # 从列表中添加节点时分配属性
print(G.nodes(data=True))

输出:

[(1, {'index': '1th'})]
[(1, {'index': '0th'})]
[(1, {'index': '0th'}), (2, {'index': '2/3th'}), (3, {'index': '2/3th'})]
# 边的属性
G = nx.Graph(day='manday')
G.add_edge(1,2,weight=10)                    # 在添加边时分配属性
print(G.edges(data=True))
G.add_edges_from([(1,3), (4,5)], len=22)     # 从集合中添加边时分配属性
print(G.edges(data='len'))
G.add_edges_from([(3,4,{'hight':10}),(1,4,{'high':'unknow'})])
print(G.edges(data=True))
G[1][2]['weight'] = 100000                   # 通过G[][][]来添加或修改属性
print(G.edges(data=True))

输出:

[(1, 2, {'weight': 10})]
[(1, 2, None), (1, 3, 22), (4, 5, 22)]
[(1, 2, {'weight': 10}), (1, 3, {'len': 22}), (1, 4, {'high': 'unknow'}), (3, 4, {'hight': 10}), (4, 5, {'len': 22})]
[(1, 2, {'weight': 100000}), (1, 3, {'len': 22}), (1, 4, {'high': 'unknow'}), (3, 4, {'hight': 10}), (4, 5, {'len': 22})]

图转化

# 有向图转化成无向图
H = DG.to_undirected()
# 或者
H = nx.Graph(DG)# 无向图转化成有向图
F = H.to_directed()
# 或者
F = nx.DiGraph(H)

其他操作

degree(G[, nbunch, weight]):返回单个节点或nbunch节点的度数视图。

degree_histogram(G):返回每个度值的频率列表。

density(G):返回图的密度。

info(G[, n]):打印图G或节点n的简短信息摘要。

create_empty_copy(G[, with_data]):返回图G删除所有的边的拷贝。

is_directed(G):如果图是有向的,返回true。

add_star(G_to_add_to, nodes_for_star, **attr):在图形G_to_add_to上添加一个星形。

add_path(G_to_add_to, nodes_for_path, **attr):在图G_to_add_to中添加一条路径。

add_cycle(G_to_add_to, nodes_for_cycle, **attr):向图形G_to_add_to添加一个循环。

节点

nodes(G):在图节点上返回一个迭代器。

number_of_nodes(G):返回图中节点的数量。

all_neighbors(graph, node):返回图中节点的所有邻居。

non_neighbors(graph, node):返回图中没有邻居的节点。

common_neighbors(G, u, v):返回图中两个节点的公共邻居。

edges(G[, nbunch]):返回与nbunch中的节点相关的边的视图。

number_of_edges(G):返回图中边的数目。

non_edges(graph):返回图中不存在的边。

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

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

相关文章

张驰咨询:数据驱动的质量改进,六西格玛绿带在汽车业实践

尊敬的汽车行业同仁们&#xff0c;您是否曾面临生产效率低下、成本不断攀升或顾客满意度下降的困扰&#xff1f;本期专栏&#xff0c;我们将深入探讨如何通过六西格玛绿带培训&#xff0c;在汽车行业中实现过程优化和质量提升。 汽车行业的竞争日趋激烈&#xff0c;致力于提供…

【华为数据之道学习笔记】3-9元数据治理面临的挑战

华为在进行元数据治理以前&#xff0c;遇到的元数据问题主要表现为数据找不到、读不懂、不可信&#xff0c;数据分析师们往往会陷入数据沼泽中&#xff0c;例如以下常见的场景。 某子公司需要从发货数据里对设备保修和维保进行区分&#xff0c;用来不对过保设备进行服务场景分析…

Qt 使用百度的离线地图

使用百度离线地图&#xff0c;一下载百度离线包&#xff08;offlinemap&#xff09;&#xff1b;二是准备地图瓦片&#xff08;不同级别的瓦片&#xff09;&#xff1b;三 准备&#xff48;&#xff54;&#xff4d;&#xff4c;主页面&#xff1b;四&#xff0c;&#xff31;&…

深度学习 Day13——P2彩色图片分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

nodejs微信小程序+python+PHP基于spark的酒店管理系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

AnotherRedisDesktopManager安装使用 (redis可视化客户端)

下载 下载地址 AnotherRedisDesktopManager 发行版 - Gitee.com 安装 双击安装 修改安装路径 运行

Docker安装与使用

Docker 1.初识Docker Docker如何解决大型项目依赖关系复杂&#xff0c;不同组件依赖的兼容性问题&#xff1f; Docker允许开发中将应用、依赖、函数库、配置一起打包&#xff0c;形成可移植镜像Docker应用运行在容器中&#xff0c;使用沙箱机制&#xff0c;相互隔离 Docker…

phpstorm中使用 phpunit 时的配置和代码覆盖率测试注意点

初始化一个composer项目&#xff0c;composer.json配置文件如下 {"name": "zingfront/questions-php","type": "project","require": {"php": "^7.4"},"require-dev": {"phpunit/phpun…

geemap学习笔记024:从Earth Engine中获取遥感图像的缩略图

前言 遥感图像的缩略图通常是以较小的数据量对整景影像有一个全面的展示&#xff0c;便于分享和观察&#xff0c;本节就介绍一下如何获取遥感图像的缩略图。 1 导入库并显示地图 import ee import geemap import osee.Initialize() Map geemap.Map() Map2 加载数据 roi e…

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-…

项目管理工具:选品开发管理的最佳实践

Zoho Projects是一个功能强大的项目管理工具&#xff0c;可以帮助电商企业实现选品开发过程的有序管理&#xff0c;提升选品开发效率。 以下是使用Zoho Projects进行选品开发管理的步骤&#xff1a; 1.创建项目&#xff1a; 登录Zoho Projects&#xff0c;在主页上点击"新…

NSSCTF Crypto靶场练习,21-30wp

文章目录 [AFCTF 2018]你能看出这是什么加密么[LitCTF 2023]你是我的关键词(Keyworld)[NSSCTF 2022 Spring Recruit]classic[SWPUCTF 2021 新生赛]crypto4[LitCTF 2023]家人们&#xff01;谁懂啊&#xff0c;RSA签到都不会 (初级)[SWPUCTF 2021 新生赛]crypto5[LitCTF 2023]Is …

亚信科技AntDB携手蓝凌软件,助推企业数字化办公转型升级

随着企业数字化转型的深入&#xff0c;企业对于协同办公、移动门户、数字运营、智能客服等方面的需求越来越高&#xff0c;数智化正成为催生新动能和新优势的关键力量。数字化的办公平台可以帮助企业实现各类信息、流程的集中化、数字化和智能化管理&#xff0c;为企业管理者提…

面试 JVM 八股文五问五答第一期

面试 JVM 八股文五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.JVM内存布局 Heap (堆区&#xff09; 堆是 OOM 故障最主要的发生区域。它是内存…

大数据毕业设计之前端03:logo、menu的折叠展开实现

关键字&#xff1a;BuildAdmin、pinia、logo、aside、menu、菜单折叠、Vue、ElementUI 前言 上一篇文章中&#xff0c;借助aside的实现讲了一些开发的小技巧&#xff0c;以及css的解读。本篇文章主要写一下如何填充aside的内容。 aside主要是由两个部分组成的&#xff1a;log…

数据结构与算法-Rust 版读书笔记-2线性数据结构-栈

数据结构与算法-Rust 版读书笔记-2线性数据结构-栈 一、线性数据结构概念 数组、栈、队列、双端队列、链表这类数据结构都是保存数据的容器&#xff0c;数据项之间的顺序由添加或删除时的顺序决定&#xff0c;数据项一旦被添加&#xff0c;其相对于前后元素就会一直保持位置不…

【Hadoop_04】HDFS的API操作与读写流程

1、HDFS的API操作1.1 客户端环境准备1.2 API创建文件夹1.3 API上传1.4 API参数的优先级1.5 API文件夹下载1.6 API文件删除1.7 API文件更名和移动1.8 API文件详情和查看1.9 API文件和文件夹判断 2、HDFS的读写流程&#xff08;面试重点&#xff09;2.1 HDFS写数据流程2.2 网络拓…

https 协议

目录 加密方式 对称加密 非对称加密 非对称加密 非对称加密 非对称加密 对称加密 AC证书 AC证书内容 数据摘要 数据签名 在我们前面学习的http协议里面&#xff0c;我们发送的内容都是明文传输的&#xff0c;所以在安全上并不安全&#xff0c;但是在现在信息发达的时…

Linux之Apache服务器安装及配置

一、Apache服务器简介 Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的网页服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性被广泛使用。Apache曾经是世界使用排名第一的Web服务器软件&#xf…

VSCODE连接远程服务器

安装ssh插件 根据你的操作系统选择对应的版本进行下载和安装。 安装完成之后&#xff0c;启动vscode&#xff0c;选择左侧Extensions 选项卡&#xff0c;在输入框搜索 remote &#xff0c;选择安装Remote-SSH插件。 安装完成之后会在左侧新增一个选项卡Remote Explorer&#xf…