ITPub博客

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

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

原创 人工智能 作者:咚咚王者 时间:2025-11-23 19:01:41 0 删除 编辑

人工智能之数据分析 numpy

第八章 数组广播



前言

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


一、什么是广播?

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

✅ 核心优势:

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

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

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

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

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


三、广播示例详解

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

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:一维与二维(经典场景)

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:列向量与行向量

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:三维广播

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

四、广播失败的案例

❌ 维度不兼容

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

❌ 中间维度冲突

A = np.random.rand(2, 3, 4)
B = np.random.rand(2, 5, 4)
# A + B → 报错!
# 第2维:3 vs 5 → 无法广播

五、广播的实际应用

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

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:生成二维网格(用于绘图)

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:批量矩阵偏移

# 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 ...  # 根据业务逻辑    ``

  1. 使用 np.newaxis 明确维度

```python

确保 v 是列向量

v = v[:, np.newaxis]    ```

  1. 慎用高维自动广播

```python

如果不确定,先 reshape 到预期形状

b = b.reshape(1, -1)    ```


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

| 方法            | 内存         | 速度 | 推荐        |

| ----------------- | -------------- | ------ | ------------- |

| 广播  | 不复制数据   | 极快 | ✅ 首选     |

| np.tile   | 创建完整副本 | 慢   | ❌ 仅调试用 |

| np.repeat | 创建副本     | 慢   | ❌          |

# 不推荐(浪费内存)
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》

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048224/viewspace-3103060/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
深耕人工智能领域,做你的随身笔记。

注册时间:2025-10-26

  • 博文量
    47
  • 访问量
    46034