【数据分析之道-NumPy(四)】numpy广播机制

本文介绍了NumPy的广播机制,这是一种允许不同形状的数组进行算术运算的机制。文章通过示例详细解释了一维数组与二维数组、二维数组与三维数组以及标量与数组之间的广播,并强调了形状不兼容的数组不能进行广播的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

专栏导读

✍ 作者简介:i阿极,优快云 Python领域新星创作者,专注于分享python领域知识。

本文录入于《数据分析之道》,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。
订阅后,可以阅读《数据分析之道》中全部文章内容,包含python基础语法、数据结构和文件操作,科学计算,实现文件内容操作,实现数据可视化等等。
✍ 其他专栏:《机器学习案例》

1、广播机制

NumPy的广播(broadcasting)机制是一种在不同形状的数组之间进行算术运算的机制。在许多情况下,我们需要将不同形状的数组进行算术运算,此时就可以使用广播机制。

在这里插入图片描述

广播机制的规则如下:

  • 如果两个数组的形状在某个维度上不同,那么在这个维度上形状为1的数组将被扩展为与另一个数组相同的形状。

  • 如果两个数组的形状在某个维度上相同或其中一个数组在这个维度上的长度为1,那么这两个数组在这个维度上是兼容的。

  • 如果两个数组的形状在所有维度上都是兼容的,那么它们就可以进行广播。

2、一维数组和二维数组的广播

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([1, 2, 3])
c = a + b
print(c)

我们创建了一个二维数组a和一个一维数组b,并使用a + b进行加法运算。由于数组b的形状是(3,),在这个维度上长度为1,所以它可以与数组a的形状(2,3)进行广播。实际上,数组b被扩展成了形状(2,3),然后再进行加法运算,得到的结果为:

在这里插入图片描述

3、二维数组和三维数组的广播

import numpy as np

a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = np.array([[1, 2], [3, 4]])
c = a + b
print(c)

我们创建了一个三维数组a和一个二维数组b,并使用a + b进行加法运算。由于数组b的形状是(2,2),在第一维上长度为1,所以它可以与数组a的形状(2,2,2)进行广播。实际上,数组b被扩展成了形状(2,2,2),然后再进行加法运算,得到的结果为:

在这里插入图片描述

4、标量和数组的广播

import numpy as np

a = np.array([1, 2, 3])
b = 2
c = a + b
print(c)

我们将一个数组a与一个标量b进行加法运算。由于标量在任何维度上都是长度为1的数组,所以标量可以与任何形状的数组进行广播。实际上,标量b被扩展成了形状(1,),然后再与数组a的形状(3,)进行加法运算,得到的结果为:

在这里插入图片描述

5、形状不兼容的数组不能进行广播

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([1, 2])
c = a + b
print(c)

我们试图将一个形状为(2,3)的数组a与一个形状为(2,)的数组b进行广播。这两个数组在第二个维度上的长度不同,无法进行广播,会抛出ValueError异常

在这里插入图片描述


📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发优快云博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

### NumPy 广播机制概述 NumPy广播机制是一种强大的功能,允许具有不同形状的数组进行算术运算或其他操作。当两个数组的形状不完全相同时,NumPy 会尝试通过扩展较小的数组来匹配较大的数组形状[^3]。 #### 广播规则 NumPy 广播遵循以下规则: 1. 如果两个数组的维度数不同,则会在较小子数组前添加大小为 1 的轴,直到两者的维度相同。 2. 对于每一维,如果其中一个数组在此维度上的长度为 1 或两者长度相等,则可以继续广播;否则抛出错误。 以下是具体实现和验证的方法: ```python import numpy as np def can_broadcast(shape1, shape2): try: np.broadcast_shapes(shape1, shape2) return True except ValueError: return False ``` 此函数可用于测试两种形状是否能够成功广播[^1]。 --- ### 广播机制的实际应用 下面是一个简单的例子展示如何利用广播机制完成数组间的加法操作: ```python import numpy as np # 创建一个二维数组 A 和一维数组 B A = np.array([[1, 2], [3, 4]]) B = np.array([5]) # 利用广播机制将标量 5 加到数组 A 的每个元素上 C = np.add(A, B) print(C) ``` 运行以上代码的结果将是 `[[6, 7], [8, 9]]`,这表明标量被自动扩展成与数组 A 形状相同的结构并完成了逐元素加法操作[^2]。 更复杂的场景下,比如处理多个维度的数据时,也可以轻松运用广播特性来进行计算而无需显式地复制数据或调整其尺寸。 --- ### 更高级的应用实例 考虑如下情况:我们需要对三维矩阵中的每张图片加上不同的偏移值。 ```python images = np.random.rand(10, 32, 32) # 假设有 10 张灰度图像 (高度=32 宽度=32) offsets = np.arange(10).reshape(-1, 1, 1) # 不同的偏移量给定为 (10,) 向量 adjusted_images = images + offsets # 自动广播至适合的操作形式 ``` 在这里,尽管 `offsets` 是一个 `(10, 1, 1)` 大小的一维向量,但由于广播的存在,它会被视为 `(10, 32, 32)` 来执行逐像素级别的增加动作[^3]。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i阿极

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值