详解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实现图片转字符画的示例
Aug 22 Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
python名片管理系统开发
Jun 18 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 Python
如何在Python3中使用telnetlib模块连接网络设备
Sep 21 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 Python
Python - 10行代码集2000张美女图
May 23 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
解析smarty模板中类似for的功能实现
2013/06/18 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
node 命令方式启动修改端口的方法
2018/05/12 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
Python os.access()用法实例
2019/02/18 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
艺术设计专业个人求职信范文
2013/12/11 职场文书
大学生实习自我鉴定
2013/12/11 职场文书
招商专员岗位职责
2014/02/08 职场文书
校运会入场式解说词
2014/02/10 职场文书
学前教育专业求职信
2014/09/02 职场文书
病假证明模板
2015/06/19 职场文书
六年级作文之关于梦
2019/10/22 职场文书
在js中修改html body的样式
2021/11/11 Javascript