专栏首页小数志Numpy中的广播机制,你确定正确理解了吗?

Numpy中的广播机制,你确定正确理解了吗?

导读

Numpy是Python中的一个基础的数据分析工具包,其提供了大量常用的数值计算功能,当然这些数值计算函数大多依赖于其核心的数据结构:ndarray,也就是N维数组。而关于这个ndarray,有一个重要特性是广播机制,也正是整个广播机制,使得Numpy中的数值计算功能更加丰富和强大。那么问题来了,你是否已经正确理解了这个广播机制呢?

本文选摘自numpy入门详细教程,近期有感而发,稍加修改后再次发文。

广播机制是Numpy中的一个重要特性,是指对ndarray执行某些数值计算时(这里是指矩阵间的数值计算,对应位置元素1对1执行标量运算,而非线性代数中的矩阵间运算),可以确保在数组间形状不完全相同时可以自动的通过广播机制扩散到相同形状,进而执行相应的计算功能。

当然,这里的广播机制是有条件的,而非对任意形状不同的数组都能完成自动广播,显然,理解这里的"条件"是理解广播机制的核心原理。

为了探究广播机制的限制条件,我们求助于numpy的官方文档,比如在numpy源码中打开doc文件夹,可以看到有一个numpy/doc/broadcasting.py的文件,里面其实全是注释性的文档,可以找到这样一段:

条件很简单,即从两个数组的最后维度开始比较,如果该维度满足维度相等或者其中一个大小为1,则可以实现广播。当然,维度相等时相当于无需广播,所以严格的说广播仅适用于某一维度从1广播到N;如果当前维度满足广播要求,则同时前移一个维度继续比较,直至首先完成其中一个矩阵的所有维度——另一矩阵如果还有剩余的话,其实也无所谓了,这很好理解。

为了直观理解这个广播条件,举个例子,下面的情况均满足广播条件:

而如下例子则无法完成广播:

当然,以上这几个例子其实都源自刚才的numpy/doc/broadcasting.py文件。另外,doc包下还包括很多说明文档,对于深刻理解numpy运行机制大有裨益。

再进一步探究:或许值得好奇,为什么必须要1对N才能广播,N的任意因数(比如N/2、N/3等)不是都可以"合理"广播到N吗?对此,个人也曾有此困惑,我的理解是这里的"合理"只停留于数学层面的合理,但若考虑数组背后的业务含义则往往不再合理:比如两个矩阵的同一维度取值分别为2和12,那如果将2广播到12,该怎样理解这其中的广播意义呢?比如说按照奇偶不同广播?那3广播到12呢?4广播到12呢?终究还是欠缺解释性。所以numpy限制必须是1广播到N或者二者相等,才可以广播。

实际上,不止是numpy,torch或者tf中的tensor其实也是存在类似的广播机制!

本文分享自微信公众号 - 小数志(Datazhi),作者:luanhz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你确定不来了解一下Redis中List的原理吗

    在上一章中我们介绍了 Hash的一些内部原理(《你确定不来了解一下Redis中Hash的原理吗》),在这一章中我们再来讨论在五种数据结构中 List 的基本使用...

    大数据真好玩
  • 你确定不来了解一下Redis中Hash的原理吗

    Hash 也可以用来存储用户信息,和 String 不同的是 Hash 可以对用户信息的每个字段单独存储,String 则需要序列化用户的所有字段后存储.并且 ...

    大数据真好玩
  • 你对YOLOV3损失函数真的理解正确了吗?

    昨天行云大佬找到我提出了他关于GiantPandaCV公众号出版的《从零开始学YOLOV3》电子书中关于原版本的YOLOV3损失的一个质疑,并给出了他的理解。昨...

    BBuf
  • 你确定不来了解一下Redis中字符串的原理吗

    Redis 有五种基础数据结构:string,list,set,zset,hash.其中 string是最最最简单的也是最常用的.这个数据类型虽然简单但是内部的...

    王知无-import_bigdata
  • MySQL慢查询(中):正确的处理姿势,你get到了吗?

    通过梳理 MySQL中的 SQL执行过程我们发现,任何流程的执行都存在其执行环境和规则,主要导致慢查询最根本的问题就是需要访问的数据太多,导致查询不可避免的需要...

    架构精进之路
  • 你确定不来了解一下Redis跳跃表的原理吗

    目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树...

    王知无-import_bigdata
  • Python 全栈 191 问(附答案)

    作为程序员,你的电脑里、书架上,一定少不了 Python 的资料和课程。免费的电子书,花钱买的课,实体书籍...

    double
  • NumPy学习笔记—(2/3)

    通常来说,当我们面对大量数据时,第一步就是计算数据集的概要统计结果。也许最重要的概要统计数据就是平均值和标准差,它们能归纳出数据集典型的数值,但是其他的聚合函数...

    可以叫我才哥
  • Java 泛型中的通配符 T,E,K,V,?,你确定都了解吗?

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。

    芋道源码
  • Java泛型中的通配符 T,E,K,V,?,你确定都了解吗?

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。

    用户5224393
  • Java 泛型中的通配符 T,E,K,V,?,你确定都了解吗?

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。

    互扯程序
  • python数据科学系列:numpy入门详细教程

    python数据科学基础库主要是三剑客:numpy,pandas以及matplotlib,每个库都集成了大量的方法接口,配合使用功能强大。平时虽然一直在用,也看...

    luanhz
  • 从零开始深度学习(九):神经网络编程基础

    文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever

    我是管小亮
  • 机器学习在网络安全中的正确打开方式,你学废了吗?

    机器学习模型被越来越多地应用到网络安全领域,如:恶意软件检测、恶意脚本检测、加密流量监控、钓鱼邮件检测等等,机器学习在网络安全中的应用看似越来越广,但实际应用到...

    绿盟科技研究通讯
  • 机器学习在网络安全中的正确打开方式,你学废了吗?

    机器学习模型被越来越多地应用到网络安全领域,如:恶意软件检测、恶意脚本检测、加密流量监控、钓鱼邮件检测等等,机器学习在网络安全中的应用看似越来越广,但实际应用到...

    绿盟科技研究通讯
  • 探秘TensorFlow 和 NumPy 的 Broadcasting 机制

    在使用Tensorflow的过程中,我们经常遇到数组形状不同的情况,但有时候发现二者还能进行加减乘除的运算,在这背后,其实是Tensorflow的broadca...

    砸漏
  • TensorFlow 和 NumPy 的 Broadcasting 机制探秘

    在使用Tensorflow的过程中,我们经常遇到数组形状不同的情况,但有时候发现二者还能进行加减乘除的运算,在这背后,其实是Tensorflow的broadca...

    石晓文
  • 问答记录贴 1 | 解析 NumPy 的广播(broadcasting)机制

    实践出真知,相互讨论碰撞出思想的火花。【原创互助答疑群】内有的问答很精彩。于是脑子里闪现出一个想法,为什么不把整个的问答过程记录总结下来,分享给更多的小伙伴呢?...

    double
  • 《Hello NumPy》系列-广播操作就看这一篇

    这一节的内容源自于一个朋友的提问,我在交流群里也分享过,具体问题会在正文中复现,知道你们好奇,往下看就好。

    小一不二三

扫码关注云+社区

领取腾讯云代金券