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

Numpy广播机制的条件

前言

书上对广播的判断条件为:“如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。”
额,对于书上的,我感觉有点难理解哈。
下面将以尽可能详细的方式说明怎样判断两数组是否可以广播。

判断两个数组是否可广播

  1. 写出两数组的shape。
  2. 统一shape所含元素的个数。
    • 若两数组的shape所含元素的个数相等(即同维度),则直接执行步骤3;
    • 若两数组shape所含的元素个数不等(即不同维度),在维度较少的shape前面补若干个1,直到两个shape的所含元素个数相等。
  3. 在两shape中,推荐从后往前按以下方法逐个维度(即逐个数字)进行比较。每次比较的情况以及处理方法如下:
    • 如果数字大小相同,表示该维度可以广播,继续比较下一个维度。
    • 如果数字大小不同,但两数中至少一个为1,则表示该维度可以广播,继续比较下一个维度。
    • 如果数字大小不同,且两数都不为1,则该维度不可广播,不再继续比较,直接判断两个数组不能广播。
  4. 若通过步骤3判断出每个维度都可广播,则这两个数组可以进行广播。

例子

例1

若两数组的shape分别为(2,1)(8,2,1),判断是否可以广播。`

判断流程

  1. 比较维度数量
    • 第一个数组 (2,1) 有2个维度。
    • 第二个数组 (8,2,1) 有3个维度。
    • 维度数量不同,需要在第一个数组的形状前面补上1,使其维度数量与第二个数组相同。补齐后的形状变为 (1,2,1)
  2. 从最后一个维度开始,向前比较每一对维度
    • 第三个维度(最右边的维度):
      • 第一个数组的维度大小是1。
      • 第二个数组的维度大小也是1。
      • 维度大小相同,所以这一对维度可以广播。
    • 第二个维度:
      • 第一个数组的维度大小是2。
      • 第二个数组的维度大小也是2。
      • 维度大小相同,所以这一对维度可以广播。
    • 第一个维度(最左边的维度):
      • 第一个数组的维度大小是1(补齐后的)。
      • 第二个数组的维度大小是8。
      • 第一个数组该维度大小为1,所以可以广播。
  3. 因为每个维度都可广播,所以这俩数组可广播。

验证

a = torch.arange(16).numpy().reshape((8,2,1))
b = torch.arange(2).numpy().reshape((2,1))
a+b
#[[[ 0]
#   [ 2]]
# 
#  [[ 2]
#   [ 4]]
# 
#  [[ 4]
#   [ 6]]
# 
#  [[ 6]
#   [ 8]]
# 
#  [[ 8]
#   [10]]
# 
#  [[10]
#   [12]]
# 
#  [[12]
#   [14]]
# 
#  [[14]
#   [16]]]

例2

若两数组的shape分别为(4,)(3,2,5),判断是否可以广播。`

判断流程

  1. 比较维度数量
    • 第一个数组 (4,) 有1个维度。
    • 第二个数组 (3,2,5) 有3个维度。
    • 维度数量不同,需要在第一个数组的形状前面补1,使其维度数量与第二个数组相同。补齐后的形状变为 (1,1,4)
  2. 从最后一个维度开始,向前比较每一对维度
    • 第三个维度(最右边的维度):
      • 第一个数组的维度大小是4。
      • 第二个数组的维度大小也是5。
      • 两维度大小不同且都不为1,则不可以广播。

验证

a = torch.arange(30).numpy().reshape((3,2,5))
b = torch.arange(4).numpy().reshape((-1))
a+b
#ValueError: operands could not be broadcast together with shapes (3,2,5) (4,)

后话

为什么推荐从后往前

上面一大堆比较,重点无非是大小非1的维度进行比较。前面在统一维度时,是前补1,而大小为1的维度总是可广播的,所以推荐从后往前,尽可能以少的比较次数判断是否可以广播。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 二次规划及其MATLAB实现
  • 线段树介绍及线段树的使用场景
  • 【移动端】Flutter与uni-app:全方位对比分析
  • 力扣--二叉树典型题目合集(递归思想)
  • gin配置swagger文档
  • 小叶OJ 2716: 过河问题 ← 贪心算法
  • 电脑怎么恢复原来的ip地址:全面指南与注意事项
  • 编写并运行第一个spark java程序
  • 快速搭建最简单的前端项目vue+View UI Plus
  • 详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因
  • 望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会
  • sizeof和strlen的小知识
  • 【在Linux世界中追寻伟大的One Piece】网络命令|验证UDP
  • vue3-print打印eletable某一行的数据
  • Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用(text2sql)
  • Google 是如何开发 Web 框架的
  • [译] 怎样写一个基础的编译器
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【EOS】Cleos基础
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • C语言笔记(第一章:C语言编程)
  • Flex布局到底解决了什么问题
  • golang 发送GET和POST示例
  • Java 23种设计模式 之单例模式 7种实现方式
  • leetcode讲解--894. All Possible Full Binary Trees
  • php面试题 汇集2
  • Python学习之路16-使用API
  • Spring Boot MyBatis配置多种数据库
  • Spring声明式事务管理之一:五大属性分析
  • 后端_ThinkPHP5
  • 解析 Webpack中import、require、按需加载的执行过程
  • 来,膜拜下android roadmap,强大的执行力
  • 前端相关框架总和
  • 时间复杂度与空间复杂度分析
  • 学习Vue.js的五个小例子
  • 转载:[译] 内容加速黑科技趣谈
  • 1.Ext JS 建立web开发工程
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何在招聘中考核.NET架构师
  • ​Java基础复习笔记 第16章:网络编程
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​人工智能书单(数学基础篇)
  • # Apache SeaTunnel 究竟是什么?
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1) caustics\
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (算法)大数的进制转换
  • (万字长文)Spring的核心知识尽揽其中
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)原始图像数据和PDF中的图像数据
  • ****Linux下Mysql的安装和配置