人工智能之数据分析 numpy
第八章 数组广播
文章目录
- [人工智能之数据分析 numpy](#人工智能之数据分析 numpy)
- 前言
- 一、什么是广播?
- [✅ 核心优势:](#✅ 核心优势:)
- 二、广播规则(必须全部满足)
- 三、广播示例详解
- [示例 1:标量与数组(最简单)](#示例 1:标量与数组(最简单))
- [示例 2:一维与二维(经典场景)](#示例 2:一维与二维(经典场景))
- [示例 3:列向量与行向量](#示例 3:列向量与行向量)
- [示例 4:三维广播](#示例 4:三维广播)
- 四、广播失败的案例
- [❌ 维度不兼容](#❌ 维度不兼容)
- [❌ 中间维度冲突](#❌ 中间维度冲突)
- 五、广播的实际应用
- [📌 应用 1:标准化数据(Z-score)](#📌 应用 1:标准化数据(Z-score))
- [📌 应用 2:生成二维网格(用于绘图)](#📌 应用 2:生成二维网格(用于绘图))
- [📌 应用 3:批量矩阵偏移](#📌 应用 3:批量矩阵偏移)
- 六、如何避免意外广播?
- [七、广播 vs `np.tile` / `np.repeat`](#七、广播 vs
np.tile/np.repeat)- 八、总结:广播速查表
- 后续
- 资料关注
前言
NumPy 的 广播(Broadcasting) 是其最强大、也最容易被误解的特性之一。它允许不同形状的数组之间进行逐元素运算,而无需显式复制数据,既节省内存又提升性能。
一、什么是广播?
广播:NumPy 在执行算术运算时,自动将形状不同的数组"扩展"为兼容形状的机制。
✅ 核心优势:
- 避免创建不必要的副本(内存高效)
- 代码简洁(无需手动
reshape或tile) - 运算速度接近 C 语言
二、广播规则(必须全部满足)
当两个数组 A 和 B 进行运算时,从最后一个维度开始向前对齐,每个维度需满足以下之一:
- 维度相等,或
- 其中一个维度为 1,或
- 其中一个数组缺少该维度(即维度数更少)
如果所有维度都满足,则广播成功;否则报错:ValueError: operands could not be broadcast together...
三、广播示例详解
示例 1:标量与数组(最简单)
python
import numpy as np
a = np.array([1, 2, 3])
b = 10 # 标量 → 视为 shape ()
result = a + b # [11 12 13]
a.shape = (3,)b.shape = ()→ 自动扩展为(1,)→ 再广播为(3,)
示例 2:一维与二维(经典场景)
python
A = np.array([[1, 2, 3],
[4, 5, 6]]) # shape (2, 3)
v = np.array([10, 20, 30]) # shape (3,)
C = A + v
print(C)
# [[11 22 33]
# [14 25 36]]
广播过程:
- 对齐维度:
A: (2, 3)vsv: (3,)→ 补全为(1, 3) - 比较各维度:
- 第 1 维:
2vs1→ 允许(1 可扩展为 2) - 第 2 维:
3vs3→ 相等
- 第 1 维:
- 结果形状:
(2, 3)
💡
v被"复制"到每一行,但没有实际复制内存!
示例 3:列向量与行向量
python
row = np.array([1, 2, 3]) # shape (3,)
col = np.array([[10], [20]]) # shape (2, 1)
result = row + col
print(result)
# [[11 12 13]
# [21 22 23]]
广播过程:
row: (3,) → (1, 3)col: (2, 1)- 对齐后:
- 第 1 维:
1vs2→ 扩展为 2 - 第 2 维:
3vs1→ 扩展为 3
- 第 1 维:
- 结果:
(2, 3)
🔥 这是生成网格坐标的基础!
示例 4:三维广播
python
A = np.ones((3, 4, 5))
B = np.ones((4, 5))
C = A + B # 成功!B 被广播到 (1,4,5) → (3,4,5)
四、广播失败的案例
❌ 维度不兼容
python
a = np.array([1, 2]) # (2,)
b = np.array([[1, 2, 3]]) # (1, 3)
# a + b → 报错!
# 维度对齐:(1,2) vs (1,3)
# 最后一维:2 ≠ 3,且都不为1 → 无法广播
❌ 中间维度冲突
python
A = np.random.rand(2, 3, 4)
B = np.random.rand(2, 5, 4)
# A + B → 报错!
# 第2维:3 vs 5 → 无法广播
五、广播的实际应用
📌 应用 1:标准化数据(Z-score)
python
data = np.random.rand(100, 5) # 100个样本,5个特征
# 计算每列均值和标准差
mean = data.mean(axis=0) # shape (5,)
std = data.std(axis=0) # shape (5,)
# 标准化:(data - mean) / std
normalized = (data - mean) / std # 广播自动对每行操作
📌 应用 2:生成二维网格(用于绘图)
python
x = np.linspace(-2, 2, 5) # [-2 -1 0 1 2] → (5,)
y = np.linspace(-1, 1, 3) # [-1 0 1] → (3,)
# 转为列向量和行向量
X = x[np.newaxis, :] # shape (1, 5)
Y = y[:, np.newaxis] # shape (3, 1)
# 广播生成网格
grid_sum = X + Y
print(grid_sum)
# [[-3. -2. -1. 0. 1.]
# [-2. -1. 0. 1. 2.]
# [-1. 0. 1. 2. 3.]]
✅ 这正是
np.meshgrid()的底层原理!
📌 应用 3:批量矩阵偏移
python
# 10 个 3x3 矩阵
matrices = np.random.rand(10, 3, 3)
# 一个公共偏移向量(加到每行)
offset = np.array([10, 20, 30]) # (3,)
# 广播:offset 自动应用到每个矩阵的每一行
result = matrices + offset # shape (10, 3, 3)
六、如何避免意外广播?
有时广播会导致逻辑错误(如本想矩阵乘法却做了逐元素乘)。
防御性编程建议:
-
显式检查形状
pythonassert a.shape == b.shape or ... # 根据业务逻辑 -
使用
np.newaxis明确维度python# 确保 v 是列向量 v = v[:, np.newaxis] -
慎用高维自动广播
python# 如果不确定,先 reshape 到预期形状 b = b.reshape(1, -1)
七、广播 vs np.tile / np.repeat
| 方法 | 内存 | 速度 | 推荐 |
|---|---|---|---|
| 广播 | 不复制数据 | 极快 | ✅ 首选 |
np.tile |
创建完整副本 | 慢 | ❌ 仅调试用 |
np.repeat |
创建副本 | 慢 | ❌ |
python
# 不推荐(浪费内存)
A = np.array([[1, 2], [3, 4]])
B = np.tile([10, 20], (2, 1)) # 显式复制
C = A + B
# 推荐(广播)
C = A + [10, 20] # 自动广播,无内存开销
八、总结:广播速查表
| 操作 | 是否广播 | 结果形状 |
|---|---|---|
(3,) + () |
✅ | (3,) |
(2,3) + (3,) |
✅ | (2,3) |
(2,1) + (3,) |
✅ | (2,3) |
(2,3) + (2,1) |
✅ | (2,3) |
(2,3) + (3,2) |
❌ | 报错 |
(4,1,3) + (2,3) |
✅ | (4,2,3) |
🧠 记忆口诀 :从右往左对齐,1 可扩,等则留,否则错。
后续
本文主要讲述了numpy数组广播。python过渡项目部分代码已经上传至gitee,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》