文章目录

  • 简介
  • 基础广播
  • 广播规则

简介

广播描述的是NumPy如何计算不同形状的数组之间的运算。如果是较大的矩阵和较小的矩阵进行运算的话,较小的矩阵就会被广播,从而保证运算的正确进行。

本文将会以具体的例子详细讲解NumPy中广播的使用。

基础广播

正常情况下,两个数组需要进行运算,那么每个数组的对象都需要有一个相对应的值进行计算才可以。比如下面的例子:

a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 2.0, 2.0])
a * b
array([ 2.,  4.,  6.])

但是如果使用Numpy的广播特性,那么就不必须元素的个数准确对应。

比如,我们可以讲一个数组乘以常量:

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

下面的例子和上面的例子是等价的,Numpy会自动将b进行扩展。

NumPy足够聪明,可以使用原始标量值而无需实际制作副本,从而使广播操作尽可能地节省内存并提高计算效率。

第二个示例中的代码比第一个示例中的代码更有效,因为广播在乘法过程中移动的内存更少(b是标量而不是数组)。

广播规则

如果两个数组操作,NumPy会对两个数组的对象进行比较,从最后一个维度开始,如果两个数组的维度满足下面的两个条件,我们就认为这两个数组是兼容的,可以进行运算:

  1. 维度中的元素个数是相同的
  2. 其中一个维数是1

如果上面的两个条件不满足的话,就会抛出异常: ValueError: operands could not be broadcast together。

维度中的元素个数是相同的,并不意味着要求两个数组具有相同的维度个数。

比如表示颜色的256x256x3 数组,可以和一个一维的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

上面的例子中,第二维的1被拉伸到7,第三维的1被拉伸到6,第四维的1被拉伸到5。

还有更多的例子:

B      (1d array):      1
Result (2d array):  5 x 4A      (2d array):  5 x 4
B      (1d array):      4
Result (2d array):  5 x 4A      (3d array):  15 x 3 x 5
B      (3d array):  15 x 1 x 5
Result (3d array):  15 x 3 x 5A      (3d array):  15 x 3 x 5
B      (2d array):       3 x 5
Result (3d array):  15 x 3 x 5A      (3d array):  15 x 3 x 5
B      (2d array):       3 x 1
Result (3d array):  15 x 3 x 5

下面是不匹配的例子:

A      (1d array):  3
B      (1d array):  4 # trailing dimensions do not matchA      (2d array):      2 x 1
B      (3d array):  8 x 4 x 3 # second from last dimensions mismatched

再举个实际代码的例子:

>>> x = np.arange(4)
>>> xx = x.reshape(4,1)
>>> y = np.ones(5)
>>> z = np.ones((3,4))>>> x.shape
(4,)>>> y.shape
(5,)>>> x + y
ValueError: operands could not be broadcast together with shapes (4,) (5,)>>> xx.shape
(4, 1)>>> y.shape
(5,)>>> (xx + y).shape
(4, 5)>>> xx + y
array([[ 1.,  1.,  1.,  1.,  1.],[ 2.,  2.,  2.,  2.,  2.],[ 3.,  3.,  3.,  3.,  3.],[ 4.,  4.,  4.,  4.,  4.]])>>> x.shape
(4,)>>> z.shape
(3, 4)>>> (x + z).shape
(3, 4)>>> x + z
array([[ 1.,  2.,  3.,  4.],[ 1.,  2.,  3.,  4.],[ 1.,  2.,  3.,  4.]])

广播还提供了一个非常方便的进行两个1维数组进行外部乘积的运算:

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

其中a[:, np.newaxis] 将1维的数组转换成为4维的数组:

In [230]: a[:, np.newaxis]
Out[230]:
array([[ 0.],[10.],[20.],[30.]])

本文已收录于 http://www.flydean.com/07-python-numpy-broadcasting/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

NumPy之:理解广播相关推荐

  1. Python科学计算扩展库numpy中的广播运算

    首先解答上一个文章Python扩展库numpy中的布尔运算中的问题,该题答案为[111, 33, 2],题中表达式的作用是按列表中元素转换为字符串后的长度降序排序. ----------------- ...

  2. Numpy中的广播和数组运算

    https://www.toutiao.com/a6677441250955624973/ 一.概述 在Numpy中当数组进行运算时,如果两个数组的形状相同,那么两个数组相乘就是两个数组的对应位相乘, ...

  3. Numpy数组的广播机制

    文章目录 前言 数组广播 广播机制的使用条件 前言 Numpy数组不需要循环遍历,即可对每个元素执行批量的算术运算操作(矢量化运算).当两个数组大小(Numpy.shape)不同时,进行算术运算会出现 ...

  4. numpy rollaxis理解

    import numpy as np # 三维数组 想象成魔方 a = np.arange(8).reshape(2, 2, 2) print(a) print('-----------看顶部 整个右 ...

  5. numpy.meshgrid()理解

    一句话解释numpy.meshgrid()--生成网格点坐标矩阵. 关键词:网格点,坐标矩阵 网格点是什么?坐标矩阵又是什么鬼? 看个图就明白了: 图中,每个交叉点都是网格点,描述这些网格点的坐标的矩 ...

  6. pytorch 与 numpy 的数组广播机制

    20210505 从左边开始对应位置,如果一个是1,一个大于1,以大于1的为准, 不能对应位置的值不相同 缺失的维度:其中一个矩阵少某个或某些维度

  7. Python 数据分析三剑客之 NumPy(二):数组索引 / 切片 / 广播 / 拼接 / 分割

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  8. Numpy 广播机制(两个不同维度对象进行数学运算)

    1. 数组相加 一个 2*5 维的数组对象和一个 1 维的数组对象进行相加,结果会怎样? In [1]: import numpy as npIn [2]: a = np.arange(10).res ...

  9. 详解Numpy的广播机制

    广播 Numpy中有很多强大的功能,广播便是其中之一.广播能帮助你对两个不同维度的数组执行操作.例如: import numpy as np a = np.array([[0, 1],[2, 3],[ ...

最新文章

  1. 2006关注IT技术
  2. java如何获得点的横纵坐标_横纵坐标怎么区分
  3. 在Hue中创建一个Oozie工作流
  4. 【TypeScript系列教程11】函数的使用
  5. SQLi LABS Less-22
  6. SQL Server警报解决性能问题:如何创建和使用SQL Server警报
  7. 最擅长玩《毁灭战士》的AI开源了 | 来自CMU的论文代码
  8. 如何制作一个有颜色的ListBox,颜色选择下拉列表
  9. Android 对应的xml配置值,颜色表
  10. 【网易云课堂---轻松读书:番茄工作法二】
  11. 终于忙完了,要开启代码生涯了
  12. SQLSERVER 2000清除挂起
  13. 淘宝省市区获取,淘宝国家省市区数据获取 2018-01-09更新
  14. VSCODE设置绿豆沙主题
  15. java qq聊天界面_用Java制作一个简单的QQ聊天界面
  16. 数据库——数据插入、修改、删除
  17. 从无秘和知乎看中国社交产品的特点
  18. VC6.0用file-open后,出现“MSDEV.EXE-应用程序错误的解决方法
  19. 黑马程序员——C语言基础---基础语法
  20. 干货!如何录制电脑屏幕gif动图?

热门文章

  1. 多边形三角剖分问题的综述
  2. 04-树7 二叉搜索树的操作集(c语言实现)
  3. 逆向工程核心原理学习笔记(十四):栈帧1
  4. Win7 od下send断点
  5. jsoncpp和rapidjson哪个好用?
  6. 战斗民族开源神器。ClickHouse为什么能够征服各个大厂?
  7. Linux性能优化全景指南
  8. 又是金三银四,都是Java程序员,你为什么面试总拿不到高薪?
  9. WebRTC十周年、Space X成功对接国际空间站、TikTok复制品Zynn或有快手支持|Decode the Week...
  10. ​边缘计算架构如何融合视频编码与存储