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 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.mfbz.cn/a/236717.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA基础】----第一天

【JAVA基础】----第一天 命名规则注释方式对HelloWorld代码进行解释常量&#xff0c;进制转换和机器码展现计算过程常量类型1.字符串常量2.整数常量 提供了四种表现形式2.1 二进制2.2 八进制2.3 十进制2.4 十六进制2.5 进制之间的转化2.5.1 其他进制转化为十进制2.5.2 十进制转…

【算法优选】 动态规划之路径问题——贰

文章目录 &#x1f38b;前言&#x1f332;[下降最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f6a9;代码实现 &#x1f38d;[最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&…

初识RabbitMQ

一、消息队列 1、消息队列的介绍 在介绍RabbitMQ之前&#xff0c;首先来介绍下消息队列。消息队列是生产者-消费者模型的一个典型的代表&#xff0c;由一端往消息队列中不断的写入消息&#xff0c;而另一端则可以读取或者订阅队列中的消息。当新的消息入队时&#xff0c;就会通…

12.11

1.q&#xff0c;w&#xff0c;e亮led1&#xff0c;2&#xff0c;3&#xff1b; a&#xff0c;s&#xff0c;d灭led1&#xff0c;2&#xff0c;3&#xff1b; main.c #include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i0;i<ms;i){for…

红队攻防实战之Redis-RCE集锦

心若有所向往&#xff0c;何惧道阻且长 Redis写入SSH公钥实现RCE 之前进行端口扫描时发现该机器开着6379&#xff0c;尝试Redis弱口令或未授权访问 尝试进行连接Redis&#xff0c;连接成功&#xff0c;存在未授权访问 尝试写入SSH公钥 设置redis的备份路径 设置保存文件名 …

透析跳跃游戏

关卡名 理解与贪心有关的高频问题 我会了✔️ 内容 1.理解跳跃游戏问题如何判断是否能到达终点 ✔️ 2.如果能到终点&#xff0c;如何确定最少跳跃次数 ✔️ 1. 跳跃游戏 leetCode 55 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。数组中的每个元素代表…

[MySQL]SQL优化之索引的使用规则

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引失效 &#x1f4d5;最左前缀法则 &#x1f4d5;范围查询> &#x1f4d5;索引列运算&#xff0c;索引失效 &#x1f4d5;前模糊匹配 &#x1f4d5;or连接的条件 &#x1f4d5;字符串类型不加 …

C语言中的一维数组与二维数组

目录 一维数组数组的创建初始化使用在内存中的存储 二维数组创建初始化使用在内存中的存储 数组越界 一维数组 数组的创建 数组是一组相同类型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面这个数组能否成功创建&#xff1f; int count…

计算机丢失msvcp140dll怎么恢复?快速解决dll缺失问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140dll丢失”。msvcp140.dll是一个动态链接库文件&#xff0c;它包含了许多C标准库函数的实现。这些动态链接库文件是程序运行所必需的&#xff0c;它们包含了许多函数和资源&#xf…

spring结合设计模式之策略模式

策略模式基本概念&#xff1a; 一个接口或者抽象类&#xff0c;里面两个方法&#xff08;一个方法匹配类型&#xff0c;一个可替换的逻辑实现方法&#xff09;不同策略的差异化实现(就是说&#xff0c;不同策略的实现类) 使用策略模式替换判断&#xff0c;使代码更加优雅。 …

Guava反射工具详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Java反射&#xff0c;特别是在Guava这个强大的库中&#xff0c;它是怎么让反射变得更简单&#xff0c;更有趣的。咱们都知道&#xff0c;反射在Java中是个相当强大的特性&#xff0c;它允许程序在运…

AcWing 95. 费解的开关(递推)

题目链接 活动 - AcWing 本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向有一定编程基础的同学。https://www.acwing.com/problem/content/97/ 题解 只要第一行开关的状态确定&#xff0c;则所有开关的状态都可以被推出来。第一行开关总共有种操…

从零开始学R语言?这个网站帮你快速入门,成为数据分析高手!

介绍&#xff1a;R语言&#xff0c;全称The R Programming Language&#xff0c;是一种属于GNU系统的自由、免费、源代码开放的软件。它主要被用于统计计算和统计制图&#xff0c;因此&#xff0c;它是统计分析和数据可视化的优秀工具。 R语言的特点丰富多样。首先&#xff0c;…

入职字节外包一个月,我离职了。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

AWS攻略——使用Public NAT解决私有子网实例访问互联网

文章目录 创建NAT网关编辑Private子网路由测试知识点参考资料 在《AWS攻略——子网》一文中&#xff0c;我们分别创建了一个Public子网和一个Private子网&#xff0c;并让Public子网中的实例可以SSH登录到Private子网的实例中。 现实场景中&#xff0c;我们可能存在如下需求&a…

用微元思想求解三重积分——基于Matlab

仅作自己学习使用 1. 题目 求解下列三重积分&#xff0c;其中A&#xff0c;μ&#xff0c;r都是常数。 求解的准确性可以用下式进行评估&#xff1a; 听过考研数一张宇课程的朋友应该指导&#xff0c;求解三重积分就是就一个面包&#xff0c;我们将面包无限细分为一个小块&a…

Python常见面试知识总结(二):数据结构、类方法及异常处理

【十三】Python中assert的作用&#xff1f; Python中assert&#xff08;断言&#xff09;用于判断一个表达式&#xff0c;在表达式条件为 f a l s e false false的时候触发异常。 断言可以在条件不满足程序运行的情况下直接返回错误&#xff0c;而不必等待程序运行后出现崩溃…

2023最新版JavaSE教程——第10天:多线程

目录 一、相关概念1.1 程序、进程与线程1.2 查看进程和线程1.3 线程调度1.4 多线程程序的优点1.5 补充概念1.5.1 单核CPU和多核CPU1.5.2 并行与并发 二、创建和启动线程2.1 概述2.2 方式1&#xff1a;继承Thread类2.3 方式2&#xff1a;实现Runnable接口2.4 变形写法2.5 对比两…

OpenAI接口调用示例

最近为公司做了一个ChatGPT工具&#xff0c;这里展示一下OpenAI接口的调用 前提条件 访问OpenAI官网&#xff08;国内需要翻墙&#xff09;的账号&#xff0c;需要sk 地址&#xff1a;https://platform.openai.com 依赖 使用开源工具调用OpenAI接口&#xff0c;依赖如下&am…
最新文章