Pandas & NumPy Academy · 课时

广播规则

理解 NumPy 的广播规则,以便在不显式复制的情况下,将一维数组加到二维数组的每一行上。

第 3 / 4 课13 个步骤

广播规则 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

广播要解决的问题

广播允许 NumPy 在不复制数据的情况下组合形状不同但相互兼容的数组——较小的数组会扩展以匹配较大的数组。

import numpy as np

# Adding a scalar to an array is the simplest broadcast
a = np.array([1, 2, 3])
print(a + 10)  # [11 12 13]
# Scalar 10 is 'broadcast' to shape (3,)

广播规则 1:在前面补 1

NumPy 会从右侧对齐形状。如果一个数组的维度更少,就在左侧补上 1——因此,在形状为 (4, 3) 的数组旁边,形状为 (3,) 的数组会表现得像 (1, 3)。

import numpy as np

m = np.ones((4, 3))
v = np.array([10, 20, 30])  # shape (3,) -> treated as (1, 3)

result = m + v   # shape (4, 3)
print(result)
# [[11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]]

广播规则 2:扩展大小为 1 的维度

任何大小为 1的维度都可以扩展,以匹配另一个数组——实际上不会复制数据。两个数组可以同时扩展各自大小为 1 的维度。

import numpy as np

# (3, 1) + (1, 4)  -->  (3, 4)
col = np.array([[1], [2], [3]])    # shape (3, 1)
row = np.array([[10, 20, 30, 40]]) # shape (1, 4)
print((col + row).shape)  # (3, 4)
print(col + row)

广播规则 3:形状不兼容

如果两个维度不相等,且都不是 1,广播就会因 ValueError 失败。先检查形状,可以得到清晰的错误,而不是悄无声息的错误结果。

import numpy as np

a = np.ones(3)
b = np.ones(4)
try:
    a + b
except ValueError as e:
    print(e)
# operands could not be broadcast together with shapes (3,) (4,)

实践:减去列平均值

一个经典操作是:从每一行中减去各列的平均值,从而使数据以 0 为中心。使用 keepdims=True 后,平均值会保留适合广播的形状。

import numpy as np

data = np.array([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

col_mean = data.mean(axis=0)          # shape (3,)
centred = data - col_mean             # broadcast along axis 0
print(centred)
# [[-3. -3. -3.]
#  [ 0.  0.  0.]
#  [ 3.  3.  3.]]

实践:按行归一化

要使每一行的总和为 1,请除以该行的总和。使用 keepdims=True,这样总和会保持形状 (n, 1),并沿列进行广播。

import numpy as np

m = np.array([[1., 2., 3.],
              [4., 5., 6.]])

row_sums = m.sum(axis=1, keepdims=True)  # shape (2, 1)
normed = m / row_sums
print(normed.round(3))
# [[0.167 0.333 0.5  ]
#  [0.267 0.333 0.4  ]]

通过广播计算外积

将一个数组重塑为 (n, 1),将另一个数组重塑为 (1, m),然后进行相乘——广播会为您构建完整的外积矩阵,无需编写循环。

import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 20, 30, 40])

outer = a[:, np.newaxis] * b[np.newaxis, :]
print(outer)
# [[ 10  20  30  40]
#  [ 20  40  60  80]
#  [ 30  60  90 120]]

对三维数组进行广播

广播可以扩展到任意维度。形状为 (100, 28, 28) 的图像批次,可以减去形状为 (1, 28, 28) 的逐像素平均值来进行中心化——NumPy 会扩展这个 1。

import numpy as np

batch = np.random.rand(100, 28, 28)  # 100 images
pixel_mean = batch.mean(axis=0, keepdims=True)  # (1, 28, 28)
centred = batch - pixel_mean          # (100, 28, 28)
print(centred.shape)  # (100, 28, 28)

使用 np.broadcast_to 显式扩展

np.broadcast_to 会准确展示广播产生的结果,并以不复制数据的只读视图呈现。它非常适合直观理解形状的对齐方式。

import numpy as np

a = np.array([1, 2, 3])
view = np.broadcast_to(a, (4, 3))
print(view)
# [[1 2 3]
#  [1 2 3]
#  [1 2 3]
#  [1 2 3]]
print(view.flags.writeable)  # False

直观理解兼容的形状

一个实用规则是:从右侧对齐形状,并逐一检查每对维度。如果两个维度相等,或其中一个为 1,它们就是兼容的。运行代码前,先预测形状!

# Shape compatibility examples:
# (3, 4) + (   4) -> (3, 4)  OK: 4==4, 1 implied
# (3, 4) + (3, 1) -> (3, 4)  OK: 4 vs 1, 3==3
# (2, 3, 4) + (3, 4) -> (2, 3, 4)  OK
# (3, 4) + (3,  ) -> ERROR: 4 vs 3
import numpy as np
print(np.zeros((3,4)).shape)       # (3, 4)
print((np.zeros((3,4)) + np.zeros(4)).shape)  # (3, 4)

常见的广播错误

广播中最常见的陷阱,是聚合后忘记使用 keepdims=True,导致形状无法对齐。如果遇到问题,请打印 print(arr.shape),看看实际发生了什么。

import numpy as np

m = np.arange(6).reshape(2, 3)
row_max = m.max(axis=1)            # shape (2,)  NOT (2,1)
print(row_max.shape)               # (2,)
# m - row_max  -> ERROR: shapes (2,3) and (2,) misalign

row_max_col = row_max[:, np.newaxis]  # shape (2, 1)
print((m - row_max_col).shape)     # (2, 3)  OK

快速检查

请检验您对本课 NumPy 广播规则的理解。

课程回顾

您已经掌握了!广播会扩展大小为 1 的维度,从右侧比较形状,而 keepdims=True 会保留轴,使数学运算能够对齐。接下来学习:布尔掩码。

免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「广播规则」课时是免费的吗?

是的 — 「广播规则」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「广播规则」这节课中我会学到什么?

理解 NumPy 的广播规则,以便在不显式复制的情况下,将一维数组加到二维数组的每一行上。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「广播规则」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 通用函数(ufunc)
  2. 聚合函数
  3. 广播规则
  4. 布尔掩码与高级索引
← 返回 Pandas & NumPy Academy