首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >人工智能之数据分析 numpy:第八章 数组广播

人工智能之数据分析 numpy:第八章 数组广播

原创
作者头像
咚咚王
发布2025-11-23 18:59:48
发布2025-11-23 18:59:48
680
举报

人工智能之数据分析 numpy

第八章 数组广播


前言

NumPy 的 广播(Broadcasting) 是其最强大、也最容易被误解的特性之一。它允许不同形状的数组之间进行逐元素运算,而无需显式复制数据,既节省内存又提升性能。


一、什么是广播?

广播:NumPy 在执行算术运算时,自动将形状不同的数组“扩展”为兼容形状的机制。

✅ 核心优势:

  • 避免创建不必要的副本(内存高效)
  • 代码简洁(无需手动 reshapetile
  • 运算速度接近 C 语言

二、广播规则(必须全部满足)

当两个数组 AB 进行运算时,从最后一个维度开始向前对齐,每个维度需满足以下之一:

  1. 维度相等,或
  2. 其中一个维度为 1,或
  3. 其中一个数组缺少该维度(即维度数更少)

如果所有维度都满足,则广播成功;否则报错:ValueError: operands could not be broadcast together...


三、广播示例详解

示例 1:标量与数组(最简单)

代码语言:python
复制
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,)

示例 2:一维与二维(经典场景)

代码语言:python
复制
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)
  • 比较各维度:
    • 第 1 维:2 vs 1 → 允许(1 可扩展为 2)
    • 第 2 维:3 vs 3 → 相等
  • 结果形状:(2, 3)

💡 v 被“复制”到每一行,但没有实际复制内存


示例 3:列向量与行向量

代码语言:python
复制
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 维:1 vs 2 → 扩展为 2
    • 第 2 维:3 vs 1 → 扩展为 3
  • 结果:(2, 3)

🔥 这是生成网格坐标的基础!


示例 4:三维广播

代码语言:python
复制
A = np.ones((3, 4, 5))
B = np.ones((4, 5))

C = A + B  # 成功!B 被广播到 (1,4,5) → (3,4,5)

四、广播失败的案例

❌ 维度不兼容

代码语言:python
复制
a = np.array([1, 2])        # (2,)
b = np.array([[1, 2, 3]])   # (1, 3)

# a + b → 报错!
# 维度对齐:(1,2) vs (1,3)
# 最后一维:2 ≠ 3,且都不为1 → 无法广播

❌ 中间维度冲突

代码语言:python
复制
A = np.random.rand(2, 3, 4)
B = np.random.rand(2, 5, 4)

# A + B → 报错!
# 第2维:3 vs 5 → 无法广播

五、广播的实际应用

📌 应用 1:标准化数据(Z-score)

代码语言:python
复制
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  # 广播自动对每行操作

📌 应用 2:生成二维网格(用于绘图)

代码语言:python
复制
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() 的底层原理!

📌 应用 3:批量矩阵偏移

代码语言:python
复制
# 10 个 3x3 矩阵
matrices = np.random.rand(10, 3, 3)

# 一个公共偏移向量(加到每行)
offset = np.array([10, 20, 30])  # (3,)

# 广播:offset 自动应用到每个矩阵的每一行
result = matrices + offset  # shape (10, 3, 3)

六、如何避免意外广播?

有时广播会导致逻辑错误(如本想矩阵乘法却做了逐元素乘)。

防御性编程建议:

  1. 显式检查形状assert a.shape == b.shape or ... # 根据业务逻辑
  2. 使用 np.newaxis 明确维度# 确保 v 是列向量 v = v[:, np.newaxis]
  3. 慎用高维自动广播# 如果不确定,先 reshape 到预期形状 b = b.reshape(1, -1)

七、广播 vs np.tile / np.repeat

方法

内存

速度

推荐

广播

不复制数据

极快

✅ 首选

np.tile

创建完整副本

❌ 仅调试用

np.repeat

创建副本

代码语言:python
复制
# 不推荐(浪费内存)
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,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。

资料关注

公众号:咚咚王

《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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 人工智能之数据分析 numpy
  • 前言
  • 一、什么是广播?
    • ✅ 核心优势:
  • 二、广播规则(必须全部满足)
  • 三、广播示例详解
    • 示例 1:标量与数组(最简单)
    • 示例 2:一维与二维(经典场景)
    • 示例 3:列向量与行向量
    • 示例 4:三维广播
  • 四、广播失败的案例
    • ❌ 维度不兼容
    • ❌ 中间维度冲突
  • 五、广播的实际应用
    • 📌 应用 1:标准化数据(Z-score)
    • 📌 应用 2:生成二维网格(用于绘图)
    • 📌 应用 3:批量矩阵偏移
  • 六、如何避免意外广播?
    • 防御性编程建议:
  • 七、广播 vs np.tile / np.repeat
  • 八、总结:广播速查表
  • 后续
  • 资料关注
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档