Numpy的广播机制(用于自动处理不同形状的数组)

news/2024/7/23 15:55:30 标签: numpy

NumPy 广播是一种强大的机制,允许 NumPy 在执行元素级运算时自动处理不同形状的数组。广播的规则使得无需显式地创建匹配形状的数组,直接进行运算,大大简化了代码并提高了效率。

基本概念

广播的基本思想是让较小的数组在需要的维度上进行扩展,以便与较大的数组进行兼容的形状匹配。广播的核心规则是:如果两个数组的后缘维度(即从末尾开始算起的维度)大小相同,或其中一个大小为 1,则它们是广播兼容的。

广播规则

广播机制遵循以下规则:

  1. 如果两个数组的维度数不同,则将维度较小的数组的形状前面补 1,直到两个数组具有相同的维度数。
  2. 然后,从末尾维度开始,比较两个数组的大小:
    • 如果两个维度大小相同,继续比较下一个维度。
    • 如果其中一个维度大小为 1,则扩展这个维度以匹配另一个维度。
    • 如果两个维度大小不同且都不为 1,则抛出错误。

示例

示例 1:相同维度
import numpy as np

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

# A 和 B 都是形状为 (3,) 的一维数组
C = A + B
print(C)  # 输出: [5 7 9]
示例 2:不同维度
import numpy as np

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

# A 的形状为 (2, 3)
# B 的形状为 (3,)
# B 被广播为 [[1, 2, 3], [1, 2, 3]]
C = A + B
print(C)  # 输出: [[2 4 6]
          #      [5 7 9]]

示例 3:扩展维度
import numpy as np

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

# A 的形状为 (2, 3)
# B 的形状为 (2, 1)
# B 被广播为 [[1, 1, 1], [2, 2, 2]]
C = A + B
print(C)  # 输出: [[2 3 4]
          #      [6 7 8]]

广播机制的实际应用

广播机制在数据处理和科学计算中非常有用,可以简化许多操作。下面是一些常见的应用场景:

标量和数组的运算
import numpy as np

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

# A 的形状为 (2, 3)
# B 的形状为 (2, 1)
# B 被广播为 [[1, 1, 1], [2, 2, 2]]
C = A + B
print(C)  # 输出: [[2 3 4]
          #      [6 7 8]]
矩阵和向量的运算
import numpy as np

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

# B 被广播为 [[1, 0, 1], [1, 0, 1]]
C = A * B
print(C)  # 输出: [[1 0 3]
          #      [4 0 6]]

总结

广播机制使得 NumPy 可以在不同形状的数组之间进行元素级运算,而无需显式地创建匹配形状的数组。理解和利用广播可以大大简化代码,提高运算效率。

对于详细的广播规则和更多的示例,你可以参考 NumPy 的官方文档:NumPy Broadcasting。


http://www.niftyadmin.cn/n/5546651.html

相关文章

bash终端快捷键

快捷键作用ShiftCtrlC复制ShiftCtrlV粘贴CtrlAltT新建终端ShiftPgUp/PgDn终端上下翻页滚动CtrlC终止命令CtrlD关闭终端CtrlA光标移动到最开始为止CtrlE光标移动到最末尾CtrlK删除此处到末尾的所有内容CtrlU删除此处至开始的所有内容CtrlD删除当前字符CtrlH删除当前字符的前一个…

JDBC操作流程

目录 简介 具体操作 1. 引入驱动包 1)下载驱动包 2)引入驱动包到项目中 2. 编写代码 1)创建数据源 2)建立连接 3)构造 SQL 语句 4)执行 SQL 语句 5)释放资源 总结 简介 JDBC 就是使…

使用引用 XML 文件来优化 EtherCAT ESI 文件的描述

使用引用 XML 文件来优化 EtherCAT ESI 文件的描述 在 EtherCAT 系统中,ESI (EtherCAT Slave Information) 文件是描述 EtherCAT 从设备属性和行为的重要文件。随着系统复杂度的增加,ESI 文件的内容可能会变得非常庞大和冗余。为了优化这些文件&#xf…

基于变分模态分解和Cramer von Mises检验的一维信号降噪方法(MATLAB)

关于变分模态分解: 变分模态分解中为什么要各个模态估计的带宽之和最小? 因为VMD是个优化问题,VMD方法首先在时域构造一个共同优化的目标,该目标在所有成分完全重构原信号的约束下追求所有成分的带宽总和最小(窄带假…

C++17 filesystem 库 学习笔记

C17 filesystem 库 学习笔记 Filesystem library1、类2、非成员函数2.1、std::filesystem::absolute2.2、std::filesystem::canonical, std::filesystem::weakly_canonical2.3、std::filesystem::relative, std::filesystem::proximate2.4、std::filesystem::copy2.5、std::fil…

鸿蒙语言基础类库:【@ohos.util.ArrayList (线性容器ArrayList)】

线性容器ArrayList 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 …

ExcelVBA运用Excel的【条件格式】(三)

ExcelVBA运用Excel的【条件格式】(三)前面知识点回顾1. 访问 FormatConditions 集合 Range.FormatConditions2. 添加条件格式 FormatConditions.Add 方法语法表达式。添加 (类型、 运算符、 Expression1、 Expression2)其中 TextOperator:***&am…

算法学习笔记(8.2)-动态规划入门进阶

目录 问题判断: 问题求解步骤: 图例: 解析: 方法一:暴力搜索 实现代码如下所示: 解析: 方法二:记忆化搜索 代码示例: 解析: 方法三:动态规划 空间…