视频封面

视频元信息

  • 视频标题:(官方中英!) 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,直到维度数相同。
  2. 在任一维度上,如果两个数组大小相同,或其中一个大小为 1,则兼容。
  3. 在任一维度上,如果大小为 1,则该数组会沿此维度扩展到匹配另一个数组的大小。
  4. 如果任一维度上大小不同且都不为 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 的技巧和诀窍。

七、关键要点回顾

  1. axis=0 垂直求和,axis=1 水平求和——最易混淆的参数。
  2. 广播让不同形状的数组可以逐元素运算,NumPy 自动扩展维度为 1 的轴。
  3. reshape 是常数时间操作,不确定维度时放心使用。
  4. 广播的四种主要形式:(m,n) 与 (1,n)、(m,n) 与 (m,1)、(m,1) 与标量、(1,n) 与标量。
  5. 广播是向量化的核心工具,避免显式 for 循环,提升代码速度和简洁度。

易错提醒:广播虽然方便,但也容易因维度不匹配产生隐蔽 bug。建议在关键运算后用 assert 或 reshape 显式确认矩阵维度,尤其是在调试神经网络时。


关键标签 / 关键词

Python广播 #Broadcasting #NumPy #向量化 #axis参数 #reshape #矩阵运算 #深度学习 #吴恩达 #神经网络编程 #逐元素运算 #维度扩展


生成时间:2026-10-10 21:37:39 生成平台:VideoNote www.xygy.top