首页 > 人工智能 > 人工智能 > 人工智能之数据分析 numpy:第八章 数组广播
第八章 数组广播
NumPy 的 广播(Broadcasting) 是其最强大、也最容易被误解的特性之一。它允许不同形状的数组之间进行 逐元素运算,而无需显式复制数据,既节省内存又提升性能。
广播:NumPy 在执行算术运算时,自动将形状不同的数组“扩展”为兼容形状的机制。
reshape 或
tile)当两个数组
A 和
B 进行运算时,从
最后一个维度开始向前对齐,每个维度需满足以下之一:
如果所有维度都满足,则广播成功;否则报错:
ValueError: operands could not be broadcast together...
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,)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) vs
v: (3,) → 补全为
(1, 3)2 vs
1 → 允许(1 可扩展为 2)3 vs
3 → 相等(2, 3)💡
v被“复制”到每一行,但 没有实际复制内存!
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 vs
2 → 扩展为 23 vs
1 → 扩展为 3(2, 3)🔥 这是生成 网格坐标的基础!
A = np.ones((3, 4, 5)) B = np.ones((4, 5)) C = A + B # 成功!B 被广播到 (1,4,5) → (3,4,5)
a = np.array([1, 2]) # (2,) b = np.array([[1, 2, 3]]) # (1, 3) # a + b → 报错! # 维度对齐:(1,2) vs (1,3) # 最后一维:2 ≠ 3,且都不为1 → 无法广播
A = np.random.rand(2, 3, 4) B = np.random.rand(2, 5, 4) # A + B → 报错! # 第2维:3 vs 5 → 无法广播
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 # 广播自动对每行操作
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()的底层原理!
# 10 个 3x3 矩阵 matrices = np.random.rand(10, 3, 3) # 一个公共偏移向量(加到每行) offset = np.array([10, 20, 30]) # (3,) # 广播:offset 自动应用到每个矩阵的每一行 result = matrices + offset # shape (10, 3, 3)
有时广播会导致 逻辑错误(如本想矩阵乘法却做了逐元素乘)。
``
python assert a.shape == b.shape or ... # 根据业务逻辑 ``
np.newaxis 明确维度```python
v = v[:, np.newaxis] ```
```python
b = b.reshape(1, -1) ```
np.tile /
np.repeat| 方法 | 内存 | 速度 | 推荐 |
| ----------------- | -------------- | ------ | ------------- |
| 广播 | 不复制数据 | 极快 | ✅ 首选 |
|
np.tile | 创建完整副本 | 慢 | ❌ 仅调试用 |
|
np.repeat | 创建副本 | 慢 | ❌ |
# 不推荐(浪费内存) 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》
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048224/viewspace-3103060/ ,如需转载,请注明出处,否则将追究法律责任。