详解Numpy中的广播原则/机制


Posted in Python onSeptember 20, 2018

广播的原则

如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。

在上面的对arr每一列减去列平均值的例子中,arr的后缘维度为3,arr.mean(0)后缘维度也是3,满足轴长度相符的条件,广播会在缺失维度进行。

这里有点奇怪的是缺失维度不是axis=1,而是axis=0,个人理解是缺失维度指的是两个arr除了轴长度匹配的维度,在上面的例子中,正好是axis=0。这块欢迎指正

arr.mean(0)沿着axis=0广播,可以看作是把arr.mean(0)沿着竖直方向复制4份,即广播的时候arr.mean(0)相当于一个shape=(4,3)的数组,数组的每一行均相同,均为arr.mean(0)

为了了解这个原则,首先我们来看一组例子:

# 数组直接对一个数进行加减乘除,产生的结果是数组中的每个元素都会加减乘除这个数。
In [12]: import numpy as np
In [13]: a = np.arange(1,13).reshape((4, 3))
In [14]: a * 2
Out[14]: array([[ 2, 4, 6],
    [ 8, 10, 12],
    [14, 16, 18],
    [20, 22, 24]])
# 接下来我们看一下数组与数组之间的计算
In [17]: b = np.arange(12,24).reshape((4,3))
In [18]: b
Out[18]: array([[12, 13, 14],
    [15, 16, 17],
    [18, 19, 20],
    [21, 22, 23]])
In [19]: a + b
Out[19]: array([[13, 15, 17],
    [19, 21, 23],
    [25, 27, 29],
    [31, 33, 35]])
In [20]: c = np.array([1,2,3])
In [21]: a+c
Out[21]: array([[ 2, 4, 6],
    [ 5, 7, 9],
    [ 8, 10, 12],
    [11, 13, 15]])
In [22]: d = np.arange(10,14).reshape((4,1))
In [23]: d
Out[23]: array([[10],
    [11],
    [12],
    [13]])
In [24]: a + d
Out[24]: array([[11, 12, 13],
    [15, 16, 17],
    [19, 20, 21],
    [23, 24, 25]])
# 从上面可以看出,和线性代数中不同的是,m*n列的m行的一维数组或者n列的一维数组也是可以计算的。

这是为什么呢?这里要提到numpy的广播原则:

如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。

在上面的代码中,a的维度是(4,3),c的维度是(1,3);d的维度是(4,1)。所以假设有两个数组,第一个的维度是(x_1, y_1, z_1),另一个数组的维度是(x_2, y_2, z_2),要判断这两个数组能不能进行计算,可以用如下方法来判断:

if z_1 == z_2 or z_1 == 1 or z_2 == 1:
 if y_1 == y_2 or y_1 == 1 or y_2 == 1:
  if x_1 == x_2 or x_1 == 1 or x_2 == 1:
   可以运算
  else:
   不可以运算
 else:
  不可以运算
else:
 不可以运算

这里需要注意:(3,3,2)和(3,2)是可以运算的,因为对于二维数组(3,2)也可以表示为(1,3,2),套用上述的规则是完全适用的,同理:(4,2,5,4)和(2,1,4)也是可以进行运算的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常见文件操作的函数示例代码
Nov 15 Python
介绍Python中几个常用的类方法
Apr 08 Python
python查询sqlite数据表的方法
May 08 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
Python 如何提高元组的可读性
Aug 26 Python
Python for循环与getitem的关系详解
Jan 02 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 Python
Python 读写文件的操作代码
Sep 20 #Python
python使用多进程的实例详解
Sep 19 #Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 #Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 #Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 #Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 #Python
win10下tensorflow和matplotlib安装教程
Sep 19 #Python
You might like
PHP实现读取一个1G的文件大小
2013/08/24 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
php实现删除空目录的方法
2015/03/16 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
讲解Python中fileno()方法的使用
2015/05/24 Python
python机器学习之神经网络(三)
2017/12/20 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
python中对数据进行各种排序的方法
2019/07/02 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Python字符串的修改方法实例
2019/12/19 Python
Python sep参数使用方法详解
2020/02/12 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
应届生自我鉴定
2013/12/11 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
初三班主任寄语大全
2014/04/04 职场文书
小学毕业演讲稿
2014/04/25 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
名人演讲稿范文
2014/09/16 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
写给父母的感谢信
2015/01/22 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
在Python 中将类对象序列化为JSON
2022/04/06 Python