
视频元信息
- 视频标题:(官方中英!) 2026公认最好的【吴恩达深度学习】教程!附课件、代码及实战项目 Professionalization of Deep Learning p22 22 - 2.15Python中的广播
- 所属课程:吴恩达深度学习专项课程 - 神经网络与深度学习(第一门课)
- 章节:2.15 Python 中的广播(Broadcasting)
- 主讲人:吴恩达(Andrew Ng)
- 时长:约 11 分钟
- 主题:Python NumPy 中的广播机制(Broadcasting)及其在深度学习向量化计算中的应用
内容摘要(TL;DR)
本节以“计算四种食物中碳水、蛋白质、脂肪的卡路里占比”为例,演示如何用两行 NumPy 代码(A.sum(axis=0) 和 A / cal.reshape(1,4))替代显式 for 循环,实现矩阵按列归一化。随后系统讲解 Python 广播机制的核心规则:当 (m,n) 矩阵与 (1,n)、(m,1) 或标量运算时,NumPy 会自动扩展较小维度以匹配较大维度,从而进行逐元素运算。
一、引入:为什么要用广播?[00:00]
- 上一节提到广播(Broadcasting)是让 Python 代码运行更快的重要技巧。
- 本节深入探讨广播在 Python 中实际如何工作。
- 核心目标:用更少的代码、更快的速度完成矩阵运算,避免显式 for 循环。
理解:广播的本质是 NumPy 在底层自动“复制”较小数组以匹配较大数组的形状,从而支持逐元素运算。它让代码更简洁,同时利用底层 C 语言实现获得速度优势。
二、案例背景:食物卡路里占比计算 [00:11]
2.1 数据矩阵
视频以一个 3×4 矩阵为例,展示 100 克四种食物中来自碳水、蛋白质、脂肪的卡路里数:
| 营养素 | 苹果 | 牛肉 | 鸡蛋 | 土豆 |
|---|---|---|---|---|
| 碳水(Carb) | 56.0 | 8.2 | 1.2 | 68.0 |
| 蛋白质(Protein) | 1.2 | 104.0 | 57.0 | 0.9 |
| 脂肪(Fat) | 1.8 | 135.0 | 5.0 | 0.2 |
- 例如:100 克苹果含 56 卡来自碳水,来自蛋白质和脂肪的卡路里则少得多。
- 100 克牛肉含 104 卡来自蛋白质、135 卡来自脂肪。
2.2 计算目标
计算每种食物中碳水、蛋白质、脂肪各自贡献的卡路里百分比。
手工计算示例(苹果):
- 总卡路里 = 56 + 1.2 + 1.8 = 59 卡
- 碳水占比 = 56 / 59 ≈ 94.9%
易错点: 分母是每一列(每种食物)的总和,不是整张矩阵的总和。方向搞错会导致结果完全错误。
2.3 关键问题
能否不使用显式 for 循环完成这个计算? [01:54]
三、代码实现:两行搞定 [02:04]
3.1 矩阵定义
将数据矩阵记为 3×4 矩阵 A:
import numpy as np
A = np.array([[56.0, 0.0, 1.2, 68.0],
[1.2, 104.0, 57.0, 0.9],
[1.8, 135.0, 5.0, 0.2]])
3.2 第一行代码:按列求和 [02:55]
cal = A.sum(axis=0)
# 输出: [59.0, 239.0, 63.2, 69.1]
axis=0表示垂直方向求和(沿列方向压缩,得到每一列的总和)。- 结果
cal是一个 1×4 矩阵,对应四种食物的总卡路里。
重点:
axis=0是垂直求和,axis=1是水平求和。这是 NumPy 中最容易记混的参数之一。
3.3 第二行代码:按列归一化 [03:19]
percentage = 100 * A / cal.reshape(1, 4)
# 输出: 3×4 矩阵,每列百分比之和为 100%
- 用 3×4 矩阵 A 除以 1×4 矩阵
cal,这就是广播的典型应用。 - 结果第一列第一行 = 56 / 59 ≈ 94.9%,与手工计算一致。
3.4 关于 reshape 的说明 [04:42]
- 技术上,
cal本身就是 1×4 矩阵,不需要再调用 reshape,这一步是冗余的。 - 但吴恩达建议:当不确定矩阵维度时,养成调用 reshape 的习惯。
- reshape 是常数时间操作(constant time),调用成本极低,不用担心性能问题。
思考:这是一种防御性编程思维——用极小的成本换取代码维度的确定性,避免因维度不匹配导致的隐蔽 bug。
四、广播机制详解 [05:21]
4.1 核心问题
3×4 矩阵如何能除以 1×4 矩阵?NumPy 在底层做了什么?
4.2 示例一:向量 + 标量
[1] [100] [101]
[2] + [100] = [102]
[3] [100] [103]
[4] [100] [104]
- 4×1 向量加一个数,Python 会把该数扩展成 4×1 向量,每个元素都加 100。
- 这正是逻辑回归中
b参数(标量)加到向量上的广播形式。
4.3 示例二:(m,n) 矩阵 + (1,n) 矩阵
[1 2 3] [100 200 300] [101 202 303]
[4 5 6] + [100 200 300] = [104 205 306]
- 2×3 矩阵加 1×3 矩阵:Python 将 1×3 矩阵垂直复制 m 次,变成 m×n 矩阵后逐元素相加。
- 视频中的除法案例本质与此相同,只是运算从加法换成了除法。
4.4 示例三:(m,n) 矩阵 + (m,1) 矩阵
[1 2 3] [100 100 100] [101 102 103]
[4 5 6] + [200 200 200] = [204 205 206]
- 2×3 矩阵加 2×1 矩阵:Python 将 2×1 矩阵水平复制 n 次,变成 m×n 矩阵后逐元素相加。
4.5 通用广播原则 [08:08]
| 运算形式 | 广播行为 |
|---|---|
| (m,n) 与 (1,n) 运算 | 将 (1,n) 垂直复制 m 次 → (m,n) |
| (m,n) 与 (m,1) 运算 | 将 (m,1) 水平复制 n 次 → (m,n) |
| (m,1) 与标量(1×1)运算 | 将标量复制 m 次 → (m,1) |
| (1,n) 与标量(1×1)运算 | 将标量复制 n 次 → (1,n) |
- 以上四类运算均支持加、减、乘、除四种逐元素操作。
重点: 广播的通用原则——当两个数组维度不同时,NumPy 会将维度为 1 的轴沿该轴方向扩展,直到与另一个数组匹配。
4.6 更通用的广播规则【拓展】
NumPy 官方文档中广播的完整规则如下(比视频中介绍的四类更通用):
- 如果两个数组维度数不同,维度较少的数组会在前面补 1,直到维度数相同。
- 在任一维度上,如果两个数组大小相同,或其中一个大小为 1,则兼容。
- 在任一维度上,如果大小为 1,则该数组会沿此维度扩展到匹配另一个数组的大小。
- 如果任一维度上大小不同且都不为 1,则抛出错误。
示例:
# (3,1) 与 (1,4) 广播 → (3,4)
a = np.array([[1],[2],[3]]) # shape (3,1)
b = np.array([[10,20,30,40]]) # shape (1,4)
c = a + b # shape (3,4)
理解:视频中只讲了深度学习中最常用的四类广播,但 NumPy 的广播能力远不止于此。掌握完整规则有助于理解更复杂的张量运算。
五、MATLAB/Octave 对比 [10:03]
- 若你用过 MATLAB 或 Octave 中的
bsxfun函数,它做的是类似的事情。 - 但
bsxfun与 Python 广播并不完全相同,只是用途相似。 - 这是面向高级 MATLAB/Octave 用户的内容,不熟悉可以完全忽略,在 Python 中编写神经网络不需要了解。
思考:这说明广播并非 Python 独有,而是一种数组编程的通用范式。NumPy 把它做得更自然、更隐式。
六、总结与作业提示 [10:38]
- 广播不仅让代码运行更快,还能用更少的代码行数完成任务。
- 在后续编程作业中,广播将帮助你高效实现向量化计算。
- 下节预告:分享一些减少 Python 代码 bug 的技巧和诀窍。
七、关键要点回顾
axis=0垂直求和,axis=1水平求和——最易混淆的参数。- 广播让不同形状的数组可以逐元素运算,NumPy 自动扩展维度为 1 的轴。
reshape是常数时间操作,不确定维度时放心使用。- 广播的四种主要形式:(m,n) 与 (1,n)、(m,n) 与 (m,1)、(m,1) 与标量、(1,n) 与标量。
- 广播是向量化的核心工具,避免显式 for 循环,提升代码速度和简洁度。
易错提醒:广播虽然方便,但也容易因维度不匹配产生隐蔽 bug。建议在关键运算后用
assert或reshape显式确认矩阵维度,尤其是在调试神经网络时。
关键标签 / 关键词
Python广播 #Broadcasting #NumPy #向量化 #axis参数 #reshape #矩阵运算 #深度学习 #吴恩达 #神经网络编程 #逐元素运算 #维度扩展
生成时间:2026-10-10 21:37:39 生成平台:VideoNote www.xygy.top