当前位置: 首页 > article >正文

深入理解 NumPy 广播机制:从基础到应用

目录

  • 什么是广播机制?
  • 广播机制的规则
  • 广播机制示例
    • 1. 一维数组与标量运算
    • 2. 二维数组与一维数组运算
    • 3. 维度不同的数组运算
    • 4. 广播失败的情况
  • 广播机制的实际应用场景
    • 1. 数据归一化
    • 2. 批量计算欧氏距离
  • 总结
    • 广播机制的核心要点:

在使用 NumPy 进行数组操作时,你会发现不同形状的数组居然可以直接进行算术运算。这种神奇的功能背后,就是 广播机制(Broadcasting)。本文将详细讲解 NumPy 广播机制的工作原理、规则,以及如何在实际场景中应用它,帮助你高效地进行数值计算。


什么是广播机制?

广播机制 是 NumPy 中用于处理不同形状数组之间算术运算的一种方法。当两个数组的形状不完全相同时,NumPy 通过自动扩展(广播)较小的数组来匹配较大的数组,从而使它们能够进行逐元素运算。

这种机制避免了手动调整数组形状的繁琐过程,大大提高了代码的简洁性和执行效率。


广播机制的规则

在进行广播时,NumPy 遵循以下三条规则来扩展数组:

  1. 如果两个数组的维度数不同,较小的数组会在左侧添加 1 维度,直到它们的维度数相同。
  2. 如果两个数组在某个维度上的大小不相同,但其中一个维度的大小为 1,那么 NumPy 会在该维度上扩展大小为 1 的数组。
  3. 如果两个数组在某个维度上的大小不相同,且两个数组的该维度都不为 1,则会报错。

广播机制示例

1. 一维数组与标量运算

当一维数组与标量进行运算时,标量会被广播到数组的每个元素。

import numpy as np

arr = np.array([1, 2, 3, 4])
result = arr + 10
print(result)

输出:

[11 12 13 14]

解释:
标量 10 被广播为 [10, 10, 10, 10],然后与 arr 逐元素相加。


2. 二维数组与一维数组运算

当一个二维数组和一个一维数组进行运算时,如果一维数组的形状与二维数组的某个维度匹配,则一维数组会沿着另一个维度进行广播。

arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
arr_1d = np.array([10, 20, 30])

result = arr_2d + arr_1d
print(result)

输出:

[[11 22 33]
 [14 25 36]]

解释:

  • arr_2d 的形状是 (2, 3),即 2 行 3 列。
  • arr_1d 的形状是 (3,),即 1 行 3 列。
  • arr_1d 被广播到与 arr_2d 的每一行相同,形成 [[10, 20, 30], [10, 20, 30]],然后进行加法运算。

3. 维度不同的数组运算

如果两个数组的维度数不同,NumPy 会在较小的数组左侧添加 1,然后尝试进行广播。

arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
arr_1d_col = np.array([[10], [20]])

result = arr_2d + arr_1d_col
print(result)

输出:

[[11 12 13]
 [24 25 26]]

解释:

  • arr_2d 的形状是 (2, 3)
  • arr_1d_col 的形状是 (2, 1),即两行一列。
  • arr_1d_col 被广播到与 arr_2d 的列数匹配,形成 [[10, 10, 10], [20, 20, 20]],然后进行加法运算。

4. 广播失败的情况

如果两个数组在某个维度上的大小不相同,且其中一个数组的大小不为 1,NumPy 就无法进行广播,会报错。

arr_1 = np.array([[1, 2], [3, 4]])
arr_2 = np.array([1, 2, 3])

result = arr_1 + arr_2  # 这将报错

报错信息:

ValueError: operands could not be broadcast together with shapes (2,2) (3,)

解释:

  • arr_1 的形状是 (2, 2)arr_2 的形状是 (3,)
  • 这两个数组在第二个维度上无法匹配(23 不同),且没有维度的大小为 1,因此广播失败。

广播机制的实际应用场景

1. 数据归一化

将数据集的每一列归一化到 [0, 1] 范围内。

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
min_vals = data.min(axis=0)
max_vals = data.max(axis=0)

normalized_data = (data - min_vals) / (max_vals - min_vals)
print(normalized_data)

输出:

[[0.   0.   0.  ]
 [0.5  0.5  0.5]
 [1.   1.   1.  ]]

2. 批量计算欧氏距离

计算一组点与给定点之间的欧氏距离。

points = np.array([[1, 2], [3, 4], [5, 6]])
origin = np.array([0, 0])

distances = np.sqrt(np.sum((points - origin)**2, axis=1))
print(distances)

输出:

[2.23606798 5.         7.81024968]

总结

广播机制的核心要点:

  1. 自动扩展:通过广播机制,NumPy 可以自动扩展数组来匹配形状进行运算。
  2. 简洁高效:避免了显式地调整数组形状,提高了代码可读性和性能。
  3. 广播规则:理解广播的三条规则可以帮助你快速判断数组是否可以进行广播运算。

掌握广播机制可以帮助你在数据分析和科学计算中写出更简洁、更高效的代码。希望本文能帮助你深入理解并灵活应用 NumPy 广播机制!


http://www.kler.cn/a/429469.html

相关文章:

  • 算法每日双题精讲 —— 二分查找(二分查找,在排序数组中查找元素的第一个和最后一个位置)
  • Js:正则表达式及正则表达式方法
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证5)
  • 浅谈云计算02 | 云计算模式的演进
  • vue中的那些事(刷新+key+v-if,v-for)
  • 16_Redis Lua脚本
  • 统信系统(UOS)ARM64 nginx离线安装包(*.deb)
  • lspci简介
  • 十大排序算法C语言实现
  • 设计模式学习之——单例模式
  • 华为云云日志服务 HarmonyOS NEXT采集最佳实践
  • SpringMVC全局异常处理
  • 3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移
  • 分布式定时任务解决方案(redis版)
  • 视频自定义全屏功能——兼容安卓和ios
  • TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
  • 前端成长之路:HTML(1)
  • 【前端】理解 JavaScript 对象属性访问的复杂性
  • 数据结构——图(遍历,最小生成树,最短路径)
  • 基于阿里云Ubuntu22.04 64位服务器Java及MySql环境配置命令记录
  • mtcnn+facenet+svm实现人脸识别系统
  • 头歌答案--爬虫实战
  • .NET Framework修复工具
  • Conda 虚拟环境,共用一个还是各用各的?
  • superset 配置Connect a database
  • golang 汉字转拼音