Python 学习笔记之 networkx 使用

news2024/12/23 9:51:57

介绍 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 plt
 
G = 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.coloradmin.cn/o/1303888.html

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

相关文章

react Hooks(useRef、useMemo、useCallback)实现原理

Fiber 上篇文章fiber简单理解记录了react fiber架构&#xff0c;Hooks是基于fiber链表来实现的。阅读以下内容时建议先了解react fiber。 jsx -> render function -> vdom -> fiber树 -> dom vdom 转 fiber 的过程称为 recocile。diff算法就是在recocile这个过程…

国内外聊天AI大比拼,你知道几个?一键了解最火聊天AI应用!

国内类ChatGPT的AI工具一网打尽 2022年&#xff0c;是一个不平凡的一年。ChatGPT迅速崭露头角&#xff0c;成为备受瞩目的热门话题。特别是在OpenAI发布了基于GPT-3.5模型的ChatGPT版本后&#xff0c;这一产品因其卓越的对话能力和广泛的应用潜力&#xff0c;很快引起了大众的…

GoWeb开发框架gin-基础路由使用

文章目录 1.安装并写一个demo2.配置GoLang热加载脚手架3.配合net/http使用完整示例4.返回值4.1String返回值4.2Json返回值4.3struct结构体返回值4.4jsonp返回值4.5XML返回值 5.接收前端传过来的参数5.1get请求传值5.2form表单传值5.3接收结构体5.4路由地址传参 6.完整代码 1.安…

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

通过管理系统进行全面的线上管理。管理者可以通过基于spark的酒店管理系统&#xff0c;全面掌握酒店客房的各项状态&#xff0c;会员通过系统查询酒店客房信息&#xff0c;在线预定。 酒店作为旅游过程必须的设施&#xff0c;也逐渐需需要进行信息化管理&#xff0c;把酒店类型…

python 爬虫 m3u8 视频文件 加密解密 整合mp4

文章目录 一、完整代码二、视频分析1. 认识m3u8文件2. 获取密钥&#xff0c;构建解密器3. 下载ts文件4. 合并ts文件为mp4 三、总结 一、完整代码 完整代码如下&#xff1a; import requests import re import os from tqdm import tqdm from Crypto.Cipher import AES# 创建临…

油田中控室与32台碳储罐之间数据无线传输

二氧化碳强化石油开采技术&#xff0c;须先深入了解石油储层的地质特征和二氧化碳的作用机制。现场有8辆二氧化碳罐装车&#xff0c;每辆罐车上有4台液态二氧化碳储罐&#xff0c;每台罐的尾部都装有一台西门子S7-200 smart PLC。在注入二氧化碳的过程中&#xff0c;中控室S7-1…

json.loads和eval 速度对比

json.loads和eval 速度对比 代码1结果图代码2参考地址 代码1 import json import time import pandas as pddata_sets pd.read_pickle("val_token_id.pandas_pickle") data_sets[str(i) for i in data_sets] starttime.time() [json.loads(i) for i in data_sets] …

企业使用APP自动化测试工具的重要因素

随着移动应用市场的蓬勃发展&#xff0c;企业对高质量、高效率的软件交付提出了更高的要求。在这个背景下&#xff0c;APP自动化测试工具成为了企业不可或缺的一部分。以下是企业采用APP自动化测试工具的关键因素&#xff1a; 1. 快速且可重复的测试执行 自动化测试工具能够快速…

好看的早上问候语早安图片,今天最新唯美温馨祝福语

1、天气冷了&#xff0c;情谊不凉&#xff0c;树叶黄了&#xff0c;思念不忘&#xff0c;问候像一杯热茶&#xff0c;让人暖心&#xff01;祝愿我们与健康平安同行&#xff01;朋友们&#xff0c;大家早上好&#xff01; 2、多一个人牵挂是一种幸福&#xff1b;多一个人相知是一…

【分治】循环赛日程表Python实现

文章目录 [toc]问题描述分治算法示例Python实现 无运动员数量约束循环赛日程表算法示例Python实现 问题描述 设有 n 2 k n 2^{k} n2k个运动员要进行网球循环赛&#xff0c;设计一个满足以下要求的比赛日程表 每个选手必须与其他 n − 1 n - 1 n−1个选手各赛一次每个选手一天…

vue elementui点击按钮新增输入框(点多少次就新增多少个输入框,无限新增)

效果如图&#xff1a; 核心代码&#xff1a; <div v-for"(item,index) in arrayData" :key"item.id">//上面这个是关键代码&#xff0c;所有思路靠这个打通<el-inputtype"input" //除了输入框&#xff0c;还有textarea等placeholder&…

编程实战:自己编写HTTP服务器(系列5:执行后台命令)

系列入口&#xff1a;编程实战&#xff1a;自己编写HTTP服务器&#xff08;系列1&#xff1a;概述和应答&#xff09;-CSDN博客 本文介绍执行后台命令的shell.asp的实现。 目录 一、概述 二、主体代码 三、详解 3.1 参数 一、概述 这个功能就相当于一个终端&#xff0c;不…

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c 鸿鹄云商

鸿鹄云商 SAAS云产品概述 【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多…

MySQL:从MySQL看主从架构高可用性实现

目录 1 主备延迟 1.1 主备延迟 1.2 主备延迟的来源 1.2.1 主备机性能有差距 1.2.2 备库压力大 1.2.3 大事务 1.3 主备延迟的排查思路 3&#xff09;查看MySQL状态 2 主备切换策略 2.1 可靠性优先策略 2.2 可用性优先策略 2.3 常见切换技术 从进入互联网时代开始&a…

Linux之进程(三)(环境变量)

目录 一、基本概念 二、环境变量 1、PATH 2、HOME 3、SHELL 三、环境变量参数 四、argc和argv 一、基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。如&#xff1a;临时文件夹位置和系统文件夹位置等。环境变量通常…

【软考】信息系统项目管理师论文方向猜想

报喜不报忧&#xff0c;每天都在为鸡零狗碎推诿扯皮&#xff0c;属实是有辱师门。 通过软考&#xff0c;目前算是真正有意义的事情。 虽然都说高项的论文是个玄学&#xff0c;但是道听途说了一些通关感想还是蛮有启发的。 文件要求 参考了一份广西省高级工程师评审的文件&am…

【C语言】二分查找(详解)

&#x1f3a5; 岁月失语唯石能言的个人主页 &#x1f525;个人栏专&#xff1a;秒懂C语言 ⭐若在许我少年时&#xff0c;一两黄金一两风 一、二分查找的思路 二分查找也叫折半查找&#xff0c;二分查找针对的是一个有序的数据集合&#xff0c;每次都通过跟区间的…

C# 图解教程 第5版 —— 第18章 泛型

文章目录 18.1 什么是泛型18.2 C# 中的泛型18.3 泛型类18.3.1 声明泛型类18.3.2 创建构造类型18.3.3 创建变量和实例18.3.4 使用泛型的示例18.3.5 比较泛型和非泛型栈 18.4 类型参数的约束18.4.1 Where 子句18.4.2 约束类型和次序 18.5 泛型方法18.5.1 声明泛型方法18.5.2 调用…

宿舍智能电能表预付费系统的费控策略及应用

安科瑞电气股份有限公司 上海嘉定 201801 摘要:基于智能电能表的预付费系统平台可以实现对预付费客户的适时算费、远程费控和服务。预付费系统的费控策略包括算费子策略、催费预警提醒子策略、欠费停电子策略,介绍3个子策略的制定原则、设计流程,并以示例说明策略的实现方式,通…

每日一博 - Cache Miss Attack

文章目录 概述解决思路缓存空值键并设置短期 TTL&#xff08;生存时间&#xff09;使用布隆过滤器 伪代码1. 缓存空值键并设置短期 TTLa. 缓存空值键b. 设置短期 TTL 2. 使用布隆过滤器a. 集成布隆过滤器b. 查询布隆过滤器 进一步优化系统性能的建议 概述 在缓存管理中&#x…