1. 数组相加

一个 2*5 维的数组对象和一个 1 维的数组对象进行相加,结果会怎样?

In [1]: import numpy as npIn [2]: a = np.arange(10).reshape(2,5)In [3]: a
Out[3]:
array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])In [4]: b = np.array([2])In [5]: a + b
Out[5]:
array([[ 2,  3,  4,  5,  6],[ 7,  8,  9, 10, 11]])In [6]:

可以看到在维度不同时是将小维度的值全部匹配到大维度的值上,即把 a 中的每个元素都加上 b 的元素。但是看看下面的计算。

In [12]: c = np.array([1,2])In [13]: c
Out[13]: array([1, 2])In [14]: a + c
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-e81e582b6fa9> in <module>
----> 1 a + cValueError: operands could not be broadcast together with shapes (2,5) (2,) In [15]: c.shape
Out[15]: (2,)In [16]:

为什么 2*5 维的数组和 2 维的数组相加会报错呢? 这是因为 Numpy 的广播机制。因为 a、c 按照广播的规则,无法达成一致的 shape,所以抛出异常。

因为广播机制的存在,b 数组会适配 a 数组,按照第 0、1 维度,分别发生一次广播,广播后的 b 变为:

In [21]: b
Out[21]: array([2])In [22]: b = np.tile(b,(2,5))In [23]: b
Out[23]:
array([[2, 2, 2, 2, 2],[2, 2, 2, 2, 2]])In [24]:

然后,执行再执行加法操作时,因为 a、b 的 shape 变得完全一致,所以就能实现相加操作了。

2. 广播规则

从上面我们可以看到,不是任意 shape 的多个数组,操作时都能广播到一起,必须满足一定的约束条件。

  • NumPy 首先会比较最靠右的维度,如果最靠右的维度相等或其中一个为 1,则认为此维度相等;
  • 那么,再继续向左比较,如果一直满足,则认为两者兼容;
  • 最后,分别在对应维度上发生广播,以此补齐直到维度一致;

如下,两个数组 a、b,shape 分别为 (2,1,3)、(4,3), 它们能否广播兼容?我们来分析下。

a = np.arange(6).reshape(2,1,3) # shape: (2,1,3)
b = np.arange(12).reshape(4,3) # shape: (4,3)
  • 按照规则,从最右侧维度开始比较,数组 a, b 在此维度上的长度都为 3,相等;
  • 继续向左比较,a 在此维度上长度为 1,b 长度为 4,根据规则,也认为此维度是兼容的;
  • 继续比较,但是数组 b 已到维度终点,停止比较。

结论,数组 a 和 b 兼容,通过广播能实现 shape 一致。

3. 广播步骤

下面看看,数组 a 和 b 广播操作实施的具体步骤。

In [1]: import numpy as npIn [2]: a = np.arange(6).reshape(2,1,3)In [3]: b = np.arange(12).reshape(4, 3)In [4]: a
Out[4]:
array([[[0, 1, 2]],[[3, 4, 5]]])In [5]: b
Out[5]:
array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]])In [6]:

维度编号从 0 开始,数组 a 在维度 1 上发生广播,复制 4 次:

In [6]: a = np.repeat(a, 4, axis=1)In [7]: a
Out[7]:
array([[[0, 1, 2],[0, 1, 2],[0, 1, 2],[0, 1, 2]],[[3, 4, 5],[3, 4, 5],[3, 4, 5],[3, 4, 5]]])In [8]:

此时,数组 a 和 b 在后两个维度一致,但是数组 b 维度缺少一维,所以 b 也会广播一次:

In [8]: b = b[np.newaxis,:,:]   # 首先增加一个维度In [9]: b
Out[9]:
array([[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]])In [10]: b = np.repeat(b,2,axis=0)  # 在维度 0 上复制 2 次In [11]: b
Out[11]:
array([[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]],[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]])In [12]:

经过以上操作,数组 a 和 b 维度都变为 (2,4,3),至此广播完成,做个加法操作:

In [11]: b
Out[11]:
array([[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]],[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]])In [12]: a
Out[12]:
array([[[0, 1, 2],[0, 1, 2],[0, 1, 2],[0, 1, 2]],[[3, 4, 5],[3, 4, 5],[3, 4, 5],[3, 4, 5]]])In [13]: a + b
Out[13]:
array([[[ 0,  2,  4],[ 3,  5,  7],[ 6,  8, 10],[ 9, 11, 13]],[[ 3,  5,  7],[ 6,  8, 10],[ 9, 11, 13],[12, 14, 16]]])In [14]:

验证我们自己实现的广播操作,是否与 NumPy 中的广播操作一致,直接使用原始的 a 和 b 数组相加,看到与上面得到的结果一致。

In [14]: a = np.arange(6).reshape(2,1,3)In [15]: b = np.arange(12).reshape(4,3)In [16]: a + b
Out[16]:
array([[[ 0,  2,  4],[ 3,  5,  7],[ 6,  8, 10],[ 9, 11, 13]],[[ 3,  5,  7],[ 6,  8, 10],[ 9, 11, 13],[12, 14, 16]]])In [17]:

至此,我们已经了解了广播的规则,所以再遇到如下的广播错误时,我们就可以很清楚的知道该如何解决这样的错误。

ValueError: operands could not be broadcast together with shapes (2,5) (2,)

Numpy 广播机制(两个不同维度对象进行数学运算)相关推荐

  1. 【Python学习记录】Numpy广播机制(broadcast)

    ✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Python学习记录 文章目录 一.什么是Numpy广播机制 二.Numpy广播应用 三.Numpy广播规则 一.什么是Numpy广播机制 在Numpy. ...

  2. NumPy————NumPy广播机制的学习笔记

    1 致谢 感谢网友"FINTHON"的帮助, 原文链接如下: https://finthon.com/numpy-broadcast/ 2 前言 今天在学习K-means算法~ 想 ...

  3. python整数运算_深入 Python (6) 整数对象的数学运算

    整数的基本运算 上一节讲到,在 PyLong_Type 中定义了整数类型的各种属性,比如整数类型的名称 "int".整数对象最常用的是一些数学运算,整数对象当然也是支持这些方法的, ...

  4. python广播机制是什么意思_Python numpy 广播机制

    不同形状的数组运算时,会进行广播处理 1,让所有输入数组都向其中维度最多的数组看齐,shape属性中不足的部分都通过在前面加1补齐 2,输出数组的shape属性是输入数组的shape属性的各个轴上的最 ...

  5. python科学计算笔记(一)NumPy中ndarray对象、ufunc运算、矩阵运算

    标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针.这样为了保存一个简单的[1,2,3],需要有3个指针和三个 ...

  6. 【Python数据科学快速入门系列 | 04】Numpy四则运算、矩阵运算和广播机制的爱恨情仇

    这是机器未来的第43篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/126493989 文章目录 1. 概述 2. 四则运算 ...

  7. Numpy的广播机制详解(broadcasting)

    Numpy的广播机制详解(broadcasting) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数 ...

  8. Python中的Numpy(4.矩阵操作(算数运算,矩阵积,广播机制))

    1.基本的矩阵操作: '''1.算数运算符:加减乘除''' n1 = np.random.randint(0, 10, size=(4, 5)) print(n1) n2 = n1 + 10 # 对n ...

  9. Numpy数组的广播机制

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

最新文章

  1. ArrayMap java.lang.ArrayIndexOutOfBoundsException
  2. win8 Windows 8 设置 默认浏览器
  3. 「JupyterNotebook」Jupyter快捷键个人笔记
  4. Chrome开发者工具关于网络请求的一个隐藏技能 1
  5. Python 之 Python2 和 Python3 的区别
  6. Xshell 使用数字小键盘进行vim 写入操作.
  7. 游戏中的网络同步机制——Lockstep
  8. 获取当前北京时间API
  9. BootstrapTable的列排序怎么搞
  10. %s %*s %*.*s
  11. 【游戏开发创新】Unity+人工智能,让小朋友的画成真,六一儿童节一起来画猫猫吧(Unity | 人工智能 | 绘图 | 爬虫 | 猫妖)
  12. python爬楼梯多少种_Python 爬楼梯问题--有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法?...
  13. 如何制作考试条码标签
  14. php语言计算行李托运费_乘飞机托运行李的价格怎么计算
  15. 五年后中国将进入高收入国家行列?
  16. python模块matplotlib.pyplot用法_python模块之matplotlib
  17. 【Java游戏开发合集】毕业设计(附源码+资料+课件)
  18. 创业者该如何选择区块链游戏赛道?
  19. 西柚的大数据从踩坑到放弃-zookeeper:四、一些ZK的踩坑记录
  20. 不会编程能学前端吗?web前端需要学习什么?

热门文章

  1. 简单两步,spring aop上手即用即会
  2. UUID的使用及其原理
  3. Dosbox+Masm汇编语言
  4. 2022-2028年中国锂电池设备行业深度调研及投资前景预测报告
  5. IDEA集成Docker插件实现一键自动打包部署微服务项目
  6. 常用开源协议介绍以及开源软件规范列表
  7. 难忘的一天——装操作系统(二)
  8. 超轻量AI引擎MindSpore Lite
  9. 开放神经网络交换(ONNX)工具
  10. 算法编程Algos Programming