广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入解析NumPy中的Broadcasting广播机制
  • 729
分享到

深入解析NumPy中的Broadcasting广播机制

2024-04-02 19:04:59 729人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

前言 在吴恩达老师的深度学习专项课程中,老师有提到NumPy中的广播机制,同时那一周的测验也有涉及到广播机制的题目。那么,到底什么是NumPy中的广播机制? 官方文档 接下来到了看官

前言

在吴恩达老师的深度学习专项课程中,老师有提到NumPy中的广播机制,同时那一周的测验也有涉及到广播机制的题目。那么,到底什么是NumPy中的广播机制?

官方文档

接下来到了看官方文档的时间。

Array Broadcasting in Numpy

广播机制概述

让我们探索numpy中一个更高级的概念,这个概念被称为广播。 广播展现了NumPy在算术运算期间是如何处理具有不同形状的数组的。 受到某些约束,较小的阵列将在较大的阵列上“广播”,以使它们具有相同形状。 广播提供了一种数组矢量化操作,从而使得循环在C而不是python中发生。 它无需复制不必要的数据即可完成,并且通常算法的效率还挺高。 当然在某些情况下,广播并不是一个好办法,因为它会导致内存使用效率低,从而减慢计算速度。 本文通过示例,对广播进行了详尽的介绍。 它还提供何时使用广播的提示。

numpy操作通常是逐个元素完成的,这就需要两个数组具有完全相同的形状

Example 1


>>> from numpy import array
>>> a = array([1.0, 2.0, 3.0])
>>> b = array([2.0, 2.0, 2.0])
>>> a * b
array([ 2.,  4.,  6.])

当数组的形状满足某些条件时,numpy的广播规则将放宽这种数组限制。 将数组和标量值在一起运算时,会出现最简单的广播示例

Example 2


>>> from numpy import array
>>> a = array([1.0,2.0,3.0])
>>> b = 2.0
>>> a * b
array([ 2.,  4.,  6.])

尽管只有一个变量是数组,但是结果和之前的一个代码例子是一样的。 我们可以认为其中的标量在算术运算中被拓展成与数组a变量形状相同的数组。 例如下图中显示的中拓展的新元素只是原始标量的副本。这种拓展只是概念上的。 numpy的明智之处在于使用原始标量值而不必要创建副本,从而使广播操作尽可能地节省内存提高计算效率。 由于上面的代码例子中,乘法过程中标量移动的内存较少,所以在具有一百万个元素数组的windows 2000上,广播机制与之前的两个数组相加相比大概快10%。

Vector-Scalar multiplication

在最简单的广播示例中,标量b被拉伸为与a相同形状的数组,使得这些形状适用于逐元素乘法。

下面的规则决定了两个具有兼容形状的数组是否可以在单个代码段中进行广播。

广播机制规则

广播规则

为了广播,操作中两个阵列的尾轴的大小必须相同,或者其中一个必须是一个。

问题来了,尾轴是什么?

为此我找到了Python - numpy broadcasting - explanation of trailing axes - Stack Overflow这篇解答。

If you have two arrays with different dimensions number, say one 1x2x3 and other 2x3, then you compare only the trailing common dimensions, in this case 2x3. But if both your arrays are two-dimensional, then their corresponding sizes have to be either equal or one of them has to be 1.

In your case you have a 2x2 and 4x2 and 4 != 2 and neither 4 or 2 equals 1, so this doesn't work.

假设你有两个不同维度的数组。一个是1x2x3,另一个是2x3,那么只需要比较后面的公共尺寸,在这种情况下为2x3。 但是,**如果两个数组都是二维的,则它们的对应大小必须相等或其中之一必须为1 **。

在两个二维数组中2x2和4x2,4!= 2,并且4或2都不等于1,所以广播行不通的。

这个解释应该比较清楚了。

如果不满足此条件,则会引发异常,提示数组的形状不兼容。 广播操作创建的结果数组的大小是两个数组中每个维度的最大大小。 请注意,该规则并未说明需要具有相同维数的两个数组。 如果有一个256 x 256 x 3的RGB值数组,想要按不同的值缩放图像中的每种颜色,则可以将图像乘以具有3个值的一维数组。

Image (3D array) 256 x 256 x 3
Scale (1d array) 3
Result (3d array) 256 x 256 x 3

在下面的示例中,两个数组都具有长度为1的轴,这些轴在广播操作中被扩展为更大的大小。

A (4d array) 8 x 1 x 6 x 1
B (3d array) 7 x 1 x 5
Result (4d array) 8 x 7 x 6 x 5

下面,是几个代码例子和图形表示,有助于使广播规则直观明了。例3将一个一维数组添加到一个二维数组。

Example 3


>>> from numpy import array
>>> a = array([[ 0.0,  0.0,  0.0],
...            [10.0, 10.0, 10.0],
...            [20.0, 20.0, 20.0],
...            [30.0, 30.0, 30.0]])
>>> b = array([1.0, 2.0, 3.0])
>>> a + b
array([[  1.,   2.,   3.],
       [ 11.,  12.,  13.],
       [ 21.,  22.,  23.],
       [ 31.,  32.,  33.]])

如下图2所示,b将拓展维度大小和a一样。在图3中,当b的列维度大于a的时,由于形状不兼容而引发异常。

Matrix-Vector

如果一维数组元素的数量与二维数组列的数量匹配,则将二维数组乘以一维数组将导致广播。

当数组的尾部不相等时,广播将失败,因为无法将第一个数组的行中的值与第二个数组的元素对齐进行逐元素加法。

广播提供了一种获取两个数组的外部乘积(或任何其他外部操作)的便捷方法。 下面的示例显示两个1维数组的外部加法运算,其结果与示例3相同。

Example 4


>>> from numpy import array, newaxis
>>> a = array([0.0, 10.0, 20.0, 30.0])
>>> b = array([1.0, 2.0, 3.0])
>>> a[:,newaxis] + b
array([[  1.,   2.,   3.],
       [ 11.,  12.,  13.],
       [ 21.,  22.,  23.],
       [ 31.,  32.,  33.]])

在这里,newaxis索引运算符将一个新轴插入,使其成为二维4x1数组。 图4说明了两个阵列的拉伸以产生所需的4x3输出阵列。

在这里例子里是b = array([1.0, 2.0, 3.0]),但是下图中是0,1,2,emmmm…尊重原文吧!

vector-vector with newaxis

在某些情况下,广播会拉伸两个阵列以形成一个比任何一个初始阵列都大的输出阵列。

总结

以上是对官方文档的翻译,总的来说广播机制主要是以下几点:

  • 效率较快,性能较好
  • 广播时,操作中两个数组的尾轴的大小必须相同,或者其中之一必须是1
  • 如果两个数组都是二维的,则它们的对应大小必须相等或其中之一必须为1

通过这篇文章,你是否了解了NumPy的广播机制呢?更多相关NumPy Broadcasting广播机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入解析NumPy中的Broadcasting广播机制

本文链接: https://www.lsjlt.com/news/127152.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入解析NumPy中的Broadcasting广播机制
    前言 在吴恩达老师的深度学习专项课程中,老师有提到NumPy中的广播机制,同时那一周的测验也有涉及到广播机制的题目。那么,到底什么是NumPy中的广播机制? 官方文档 接下来到了看官...
    99+
    2022-11-12
  • NumPy中的Broadcasting广播机制是什么
    这篇文章主要介绍NumPy中的Broadcasting广播机制是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!广播机制概述让我们探索numpy中一个更高级的概念,这个概念被称为广播。 广播展现了NumPy在算术运...
    99+
    2023-06-15
  • Pytorch中的广播机制详解(Broadcast)
    目录1. Pytorch中的广播机制2. 广播机制的理解3. 两个张量进行广播机制的条件4. 当两个张量满足可广播条件后5. 从空间上理解广播机制总结1. Pytorch中的广播机制...
    99+
    2023-01-03
    Pytorch广播机制 Pytorch Broadcast 广播机制
  • 深入了解Spring的事务传播机制
    目录Spring 事务传播机制有哪些?事务传播机制使用与演示REQUIRED 使用演示REQUIRED_NEW 使用演示NESTED 使用演示总结Spring 事务传播机制是指,包含...
    99+
    2022-11-13
  • 深入解析MySQL中的各种锁机制
    MySQL 各种锁详解一、引言在并发访问中,数据库需要使用锁来保护数据的一致性和完整性。MySQL 提供了多种类型的锁,包括共享锁、排他锁、意向共享锁、意向排他锁等。本文将使用具体的代码示例介绍并解析这些锁的使用方式和特点。二、共享锁(Sh...
    99+
    2023-12-21
    MySQL - 事务 - 行锁 - 表锁
  • 深入解析Python多继承的机制
    深入探讨Python中的多继承机制引言:在Python中,多继承是一种强大而灵活的机制。通过多继承,我们可以在一个类中同时集成多个父类的属性和方法,大大增强了类的功能。多继承的基本概念多继承,即一个子类可以同时继承多个父类的属性和方法。这种...
    99+
    2023-12-30
    Python 机制 多继承
  • Broadcast广播机制在PytorchTensorNumpy中的使用详解
    目录1.什么是广播机制2.广播机制的规则3.代码举例4.原地操作1.什么是广播机制 根据线性代数的运算规则我们知道,矩阵运算往往都是在两个矩阵维度相同或者相匹配时才能运算。比如加减法...
    99+
    2022-11-11
  • 深入浅析Android中的消息机制
    本篇文章给大家分享的是有关深入浅析Android中的消息机制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、简介Android的消息机制主要是指Handler的运行机制,那么...
    99+
    2023-05-31
    android 消息机制 roi
  • 深入解析Golang锁的底层实现机制
    Golang锁的底层实现原理详解,需要具体代码示例概述:并发编程是现代软件开发中非常重要的一部分,而锁是实现并发控制的一种机制。在Golang中,锁的概念被广泛应用于并发编程中。本篇文章将深入探讨Golang锁的底层实现原理,并提供具体的代...
    99+
    2023-12-28
    Golang 底层实现
  • 深入理解Spring事务及传播机制之原理解析与实际应用
    目录事务概述事务管理事务传播机制事务传播机制实现框架源码解析总结Spring 框架是一个流行的Java应用程序框架,其中事务管理是其最重要的特性之一。事务是指一系列相关操作的集合,如...
    99+
    2023-05-16
    Spring事务及传播机制 Spring事务管理 Spring传播机制
  • mysql中的锁机制深入讲解
    前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一。 大概几个月之前项目中用到事...
    99+
    2022-10-18
  • 深入浅析Android中的ListView复用机制
    这篇文章给大家介绍深入浅析Android中的ListView复用机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.ListView的复用机制  ListView是我们经常使用的一个控件,虽然说都会用,但是...
    99+
    2023-05-31
    android listview roi
  • 深入浅析Android中的NestedScrolling滑动机制
    深入浅析Android中的NestedScrolling滑动机制?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1,如今NestedScrolling运用到很多地方了,要想好...
    99+
    2023-05-31
    nestedscrolling android roi
  • AndroidView的事件分发机制深入分析讲解
    目录1.分发对象-MotionEvent2.如何传递事件1.传递流程2.事件分发的源码解析1.Activity对点击事件的分发过程2.顶级View对点击事件的分发过程3.主要方法4....
    99+
    2023-01-29
    Android View事件分发机制 Android事件分发
  • 深入解析PHP框架中的重定向机制,你了解吗?
    PHP框架中的重定向机制是一个非常重要的功能,它可以帮助我们实现页面跳转和请求转发,使得网站的访问变得更加简单和高效。在本文中,我们将深入解析PHP框架中的重定向机制,帮助读者了解它的原理和使用方法。 一、什么是重定向机制 重定向机制是指将...
    99+
    2023-09-04
    leetcode 重定向 框架
  • MySQL InnoDB中的锁机制深入讲解
    写在前面 数据库本质上是一种共享资源,因此在最大程度提供并发访问性能的同时,仍需要确保每个用户能以一致的方式读取和修改数据。锁机制(Locking)就是解决这类问题的最好武器。 首先新建表 test,其...
    99+
    2022-10-18
  • 深入浅析Java中的内存分配机制
    本篇文章给大家分享的是有关深入浅析Java中的内存分配机制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 内存分配深入理解Java程序运行在JVM(Java ...
    99+
    2023-05-31
    java 内存分配 ava
  • 深入浅析JS中的垃圾回收机制
    基本类型存放在栈中,引用类型存放在堆中。JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。垃圾回收策略所有垃圾回收器都需要做的任务标记空间中活动(存活)对象和非...
    99+
    2023-05-14
    javascript 垃圾回收机制
  • 深入浅析java中的数据处理机制
    这篇文章给大家介绍深入浅析java中的数据处理机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MyFile .java:import java.io.BufferedReader;import java.io.Fil...
    99+
    2023-05-31
    java 数据处理机制 ava
  • 一文解析spring中事务的传播机制
    今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。Spring中的事务Spring的事务其实就是数据库的事务操作,符合ACID标...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作