【Numpy基础知识】Broadcasting广播

news2025/1/14 1:17:01

Numpy广播

来源:Numpy官网:https://numpy.org/doc/stable/user/basics.html

在这里插入图片描述

广播描述了 NumPy 在算术运算期间如何处理具有不同形状的数组。根据某些约束,较小的数组将“广播”到较大的阵列,以便它们具有兼容的形状。

导包

import numpy as np

NumPy 操作通常是逐个元素地对数组对完成的。在最简单的情况下,两个数组必须具有完全相同的形状,如以下示例所示:

a = np.array([1.0, 2.0, 3.0])
print(a)
[1. 2. 3.]
b = np.array([2.0, 2.0, 2.0])
print(b)
[2. 2. 2.]
print(a * b)
[2. 4. 6.]

当数组的形状满足某些约束时,NumPy 的广播规则放宽了此约束。最简单的广播示例发生在操作中组合数组和标量值时:

a = np.array([1.0, 2.0, 3.0])
b = 2.0
print(a)
[1. 2. 3.]
print(a * b)
[2. 4. 6.]

结果等效于前面的示例,其中 b 是一个数组。我们可以认为标量 b 在算术运算期间被拉伸成一个与 a 形状相同的数组。

在这里插入图片描述

在最简单的广播示例中,标量 b 被拉伸为与 a 形状相同的数组a,因此这些形状与逐个元素的乘法兼容。

【1】一般广播规则

在两个数组上操作时,NumPy 会逐个元素比较它们的形状。它从尾随(即最右边)维度开始,然后向左工作。两个维度兼容以下情况

  • 它们是相等的,或者
  • 其中之一是 1

如果不满足这些条件,则会引发 ValueError: operands could not be broadcast together异常,指示数组具有不兼容的形状。生成的数组的大小是沿输入的每个轴的大小不是 1。

数组不需要具有相同数量的维度。例如,如果您有一个 256x256x3 的 RGB 值数组,并且您希望将图像中的每种颜色按不同的值缩放,则可以将图像乘以具有 3 个值的一维数组。根据广播规则排列这些数组的尾轴的大小,表明它们是兼容的:

Image (3d array): 256 x 256 x 3
Scale (1d array): 3
Result (3d array): 256 x 256 x 3

当比较的维度中的任何一个是一个时,将使用另一个维度。换句话说,尺寸为 1 的尺寸被拉伸或“复制”以匹配另一个尺寸。

在以下示例中,A 和 B 数组的轴长度为 1,在广播操作期间扩展为更大的尺寸:

A (4d array): 8 x 1 x 6 x 1
B (3d array): 7 x 1 x 5
Result (4d array): 8 x 7 x 6 x 5

【2】可广播数组

一些要广播的示例

A (2d array): 5 x 4
B (1d array): 1
Result (2d array): 5 x 4

A (2d array): 5 x 4
B (1d array): 4
Result (2d array): 5 x 4

A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 5
Result (3d array): 15 x 3 x 5

A (3d array): 15 x 3 x 5
B (2d array): 3 x 5
Result (3d array): 15 x 3 x 5

A (3d array): 15 x 3 x 5
B (2d array): 3 x 1
Result (3d array): 15 x 3 x 5

下面是不广播的形状数组示例

A (1d array): 3
B (1d array): 4

A (2d array): 2 x 1
B (3d array): 8 x 4 x 3

将一维数组添加到二维数组时的广播示例:

a = np.array([[0.0, 0.0, 0.0],
              [10.0, 10.0, 10.0],
              [20.0, 20.0, 20.0],
              [30.0, 30.0, 30.0]])
print(a)
[[ 0.  0.  0.]
 [10. 10. 10.]
 [20. 20. 20.]
 [30. 30. 30.]]
b = np.array([1.0, 2.0, 3.0])
print(b)
[1. 2. 3.]
print(a + b)
[[ 1.  2.  3.]
 [11. 12. 13.]
 [21. 22. 23.]
 [31. 32. 33.]]

可以看到,结果将 b 添加到 a 的每一行。

在这里插入图片描述

如果b 的形状不匹配

在这里插入图片描述

当数组的尾随维度不相等时,广播将失败,因为无法将第一个数组的行中的值与第二个数组的元素对齐以进行逐个元素的添加。

广播提供了一种获取两个阵列的外部乘积(或任何其他外部操作)的便捷方法。以下示例显示了两个一维数组的外部加法操作:

a = np.array([0.0, 10.0, 20.0, 30.0])
b = np.array([1.0, 2.0, 3.0])
print(a)
[ 0. 10. 20. 30.]
print(b)
[1. 2. 3.]
print(a[:, np.newaxis] + b)
[[ 1.  2.  3.]
 [11. 12. 13.]
 [21. 22. 23.]
 [31. 32. 33.]]

在这里插入图片描述

在某些情况下,广播会拉伸两个数组以形成大于任一初始数组的输出数组。

在上面那个栗子里面,newaxis 索引运算符将一个新轴插入a 中,使其成为二维 4x1 数组。将 4x1 数组与形状为 (3,) 的 b 组合,将生成一个 4x3 数组。

【3】一个实际的例子:矢量量化

广播经常出现在现实世界的问题中。一个典型的例子出现在信息论、分类和其他相关领域使用的矢量量化 (VQ) 算法中。

在下面显示的非常简单的二维情况下,observation值描述了要分类的运动员的体重和身高。codes代表不同级别的运动员。1 找到最近的点需要计算观测值与每个代码之间的距离。最短的距离提供最佳匹配。在此示例中,codes[0] 是最接近的类,表示运动员可能是篮球运动员。

from numpy import array, argmin, sqrt, sum

observation = array([111.0, 188.0])
print(observation)
[111. 188.]
codes = array([[102.0, 203.0],
               [132.0, 193.0],
               [45.0, 155.0],
               [57.0, 173.0]])
print(codes)
[[102. 203.]
 [132. 193.]
 [ 45. 155.]
 [ 57. 173.]]
diff = codes - observation
print(diff)
[[ -9.  15.]
 [ 21.   5.]
 [-66. -33.]
 [-54. -15.]]
dist = sqrt(sum(diff ** 2, axis=-1))
print(dist)
[17.49285568 21.58703314 73.79024326 56.04462508]
argmin(dist)
0

在此示例中,observation数组被拉伸以匹配codes数组的形状:

Observation (1d array): 2
Codes (2d array): 4 x 2
Diff (2d array): 4 x 2

在这里插入图片描述

矢量量化的基本操作计算要分类的对象、深色方块和多个已知代码(灰色圆圈)之间的距离。在这个简单的情况下,代码表示各个类。更复杂的情况每个类使用多个代码。

通常,将大量observations值(可能从数据库中读取)与一组codes进行比较。请可以考虑以下方案:

Observation (2d array): 10 x 3
Codes (2d array): 5 x 3
Diff (3d array): 5 x 10 x 3

三维数组 diff 是广播的结果,而不是计算的必要条件。大型数据集将生成一个计算效率低下的大型中间数组。相反,如果使用围绕上述二维示例中代码的 Python 循环单独计算每个观察值,则使用更小的数组。

广播是一种强大的工具,用于编写简短且通常直观的代码,在 C 语言中非常有效地进行计算。但是,在某些情况下,广播会为特定算法使用不必要的大量内存。在这些情况下,最好用 Python 编写算法的外部循环。这也可能产生更具可读性的代码,因为随着广播中维度数量的增加,使用广播的算法往往变得更加难以解释。

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

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

相关文章

【Python机器学习】条件随机场模型CRF及在中文分词中实战(附源码和数据集)

需要源码请点赞关注收藏后评论区留言私信~~~ 基本思想 假如有另一个标注序列(代词 动词 名词 动词 动词),如何来评价哪个序列更合理呢? 条件随机场的做法是给两个序列“打分”,得分高的序列被认为是更合理的。既然要…

移动设备软件开发-Shape详解

Spape详解 1.自定义背景shape 1.1gradient 1.简介 定义渐变色,可以定义两色渐变和三色渐变,及渐变样式,它的属性有下面几个2.属性 angle,只对线性渐变是有效的放射性渐变必须指定放射性的半径,gradientRadiouscentetX和…

STM32的ST-link调试下载,各种调试接口硬件介绍

调试原理 STM32F-10X使用M3内核,该内核支持复杂的同i傲视操作,硬件调试模块允许在取指令(指令单步运行)或访问数据(数据断电时)使得内核停止。在内核停止时,内核状态都可被查询,完成…

JS基于编码方式实现加密解密文本

JS基于编码方式实现加密解密文本 严格来讲这是一种简单的编码方式:加密,将明文【注】转成编码。解密则是编码转码为明文本。 【注:明文是指没有加密的文字(或者字符串),一般人都能看懂。】 下面源码用到 这个fromCharCode() 方…

年底了,感谢大家2022年的支持,虚竹哥送10本JAVA好书

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主&#x1f3…

碧兴物联IPO过会:拟募资4亿 预计年净利降幅超10%

雷递网 雷建平 12月21日碧兴物联科技(深圳)股份有限公司(简称:“碧兴物联”)日前IPO过会,准备在科创板上市。碧兴物联计划募资4.13亿元。其中,1.92亿元用于智慧生态环境大数据服务项目&#xff…

【MySQL】JDBC编程重点知识汇总

文章目录1. JDBC (API):2. JDBC代码编写:2.1 创建数据源对象:2.2 建立连接:2.3 构造SQL语句:2.4 执行SQL:2.5 释放资源:1. JDBC (API): 前面学过很多的SQL, 实际开发中大多数的SQL都不是手敲的, 都是通过程序来执行的. 各种的数据库都会提供API方便编程语言来控制; API (Appli…

【JavaEE】网络初识

初识网络协议 OSI七层和TCP/IP五层(四层) 应用层 应用程序 代码实现 传输层 端到端传输 (如玩家对玩家) 操作系统内核实现 网络层 点到点传输 操作系统内核实现 数据链路层 相邻节点之间的传输 (如集散点…

ChatGPT能接入微信了

前两天还看到不少人讨论,要是ChatGPT接入微信是啥感觉? 这不,想你所想,项目已经来了~ 来看效果,ChatGPT就出现在普通的微信对话框里,有问必答: 甚至还能拉入群聊,大家共用&#xf…

Adobe Premiere Pro 2020 系统兼容性报告:不支持的视频驱动程序

Adobe Premiere Pro 2020 系统兼容性报告:不支持的视频驱动程序 1. 问题 打开Adobe Premiere Pro 2020,看见系统兼容性报告:不支持的视频驱动程序。如下图: 点击修复,进入安装 Intel 图形驱动程序教程页面&#xff0…

DQL查询数据

文章目录DQL指定查询字段where条件子句联表查询分页和排序子查询DQL (Data Query Language:数据查询语言) 所有的查询操作都要用到它 select简单的查询,复杂的查询都要用到它数据库最核心的语言,最重要的语言使用频率…

python写个网页,使用flask显示时间登陆注册

用python写个网页。显示当前时间 可以使用 Python 的 datetime 模块来获取当前时间,然后使用 Python 的 Flask 框架来创建网页。 首先,需要安装 Flask: pip install flask 然后,可以使用以下代码创建一个 Flask 应用程序&#…

【Numpy基础知识】字节交换

字节交换 来源:Numpy官网:https://numpy.org/doc/stable/user/basics.html 文章目录字节交换导包【1】字节排序和ndarrays 简介【2】更改字节顺序导包 import numpy as np【1】字节排序和ndarrays 简介 ndarray 是一个对象,它为内存中的数据…

2023年,我的儿子刚从美国名校毕业,就失业了...

前不久,朋友圈里一篇名为《2023年,我的儿子刚从美国名校毕业,就失业了…》的文章火爆全网。 故事里的男孩出生于一个中产阶级家庭,从每年12万的幼儿园开始一路接受了优质教育,最终不负众望从美国前50名校的商学院毕业…

Ubuntu20.04LTS环境docker+cephadm方式部署Ceph 17.2.5

Ubuntu20.04LTS环境dockercephadm方式部署Ceph 17.2.51. 前言2. 环境准备2.1. 主机信息2.2. NTP时间同步2.3. 关闭 iptable 和 firewalld2.4. 关闭 SElinux2.5. 生成SSH证书,并分发到其他节点2.6. 依赖安装3. 安装部署Ceph17.2.53.1. 安装cephadm,拉取ce…

玩转ast- 手写babel插件篇

AST抽象语法树是什么?抽象语法树(Abstract Syntax Tree,AST)是源代码语法结构的一种抽象表示它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构每个包含type属性的数据结构,都…

基于Amlogic T972:结合DTS、驱动、Datasheet,解析Pinctrl子系统、GPIO脚的复用方法

文章目录前言一、概念1.1 Pinctrl devices1.2 Pinctrl client devices二、例(1)GPIOZ_9/10 复用为 i2c2_z2.1 Pin controller devices2.1.1 设备树配置: dts2.1.2 源码:驱动配置2.1.3 Datasheet2.2 Pinctrl client devices2.2.1 设备树配置&a…

华为云桌面,开启云上高效办公之旅!

在传统办公模式中,企业必须自己购买服务器和数据库软件才能进行日常管理,部署繁琐,还需要日常运维。而云桌面办公系统通过将传统的计算机终端与云计算平台有机地结合起来,使企业能够轻松应对各种变化带来的威胁和压力。 其中华为云…

用户与技术双向推动,小游戏赛道迎来新一轮增长机会

2017 年 12 月 28 日,微信小游戏正式上线。“跳一跳”刷爆了微信朋友圈,随后欢乐斗地主、坦克大战、纪念碑谷、拳皇等经典游戏纷纷出现在小游戏平台上。在过去的5年间,各大平台纷纷紧跟微信的步伐,纷纷入局小游戏,当前…

回调函数的基本使用

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、什么是回调函数二、为什么要…