
第八章 数组广播
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)有时广播会导致逻辑错误(如本想矩阵乘法却做了逐元素乘)。
np.newaxis 明确维度# 确保 v 是列向量
v = v[:, np.newaxis]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] # 自动广播,无内存开销操作 | 是否广播 | 结果形状 |
|---|---|---|
| ✅ |
|
| ✅ |
|
| ✅ |
|
| ✅ |
|
| ❌ | 报错 |
| ✅ |
|
🧠 记忆口诀:从右往左对齐,1 可扩,等则留,否则错。
本文主要讲述了numpy数组广播。python过渡项目部分代码已经上传至gitee,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。
公众号:咚咚王
《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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。