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

人工智能之数据分析 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. 显式检查形状

    python 复制代码
    assert a.shape == b.shape or ...  # 根据业务逻辑
  2. 使用 np.newaxis 明确维度

    python 复制代码
    # 确保 v 是列向量
    v = v[:, np.newaxis]
  3. 慎用高维自动广播

    python 复制代码
    # 如果不确定,先 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,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。

资料关注

公众号:咚咚王

gitee:https://gitee.com/wy18585051844/ai_learning

《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》

相关推荐
工业机器视觉设计和实现1 小时前
我的第一个cudnn(cuda)人工智能程序(lenet)
人工智能
我叫侯小科1 小时前
PyTorch 实战:手写数字识别(MNIST)从入门到精通
人工智能·pytorch·python
Sirius Wu1 小时前
开源训练框架:MS-SWIFT详解
开发语言·人工智能·语言模型·开源·aigc·swift
Baihai_IDP1 小时前
当前的“LLM 智能”,是来自模型突破,还是工程堆砌?
人工智能·llm·aigc
IT_陈寒1 小时前
Redis 性能提升30%的7个关键优化策略,90%开发者都忽略了第3点!
前端·人工智能·后端
慕云紫英1 小时前
投票理论(voting theory)(social choice theory)
人工智能·aigc
杜子不疼.2 小时前
【Linux】进程状态全解析:从 R/S/D/T 到僵尸 / 孤儿进程
linux·人工智能·ai
草莓熊Lotso3 小时前
C++ STL map 系列全方位解析:从基础使用到实战进阶
java·开发语言·c++·人工智能·经验分享·网络协议·everything
zyplayer-doc3 小时前
升级表格编辑器,AI客服应用支持转人工客服,AI问答风格与性能优化,zyplayer-doc 2.5.6 发布啦!
人工智能·编辑器·飞书·开源软件·创业创新·有道云笔记