详解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 pdb调试方法分享
Jan 21 Python
Python操作Word批量生成文章的方法
Jul 28 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Python实现图片转字符画的示例
Aug 22 Python
python利用百度AI实现文字识别功能
Nov 27 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
python实现简单的tcp 文件下载
Sep 16 Python
python 写一个水果忍者游戏
Jan 13 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
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
php实现用户登陆简单实例
2017/04/04 PHP
php无限极分类实现方法分析
2019/07/04 PHP
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
python with statement 进行文件操作指南
2014/08/22 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
python删除某个字符
2018/03/19 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
经济管理专业毕业生推荐信
2013/11/11 职场文书
物流专业大学生的自我鉴定
2013/11/13 职场文书
挂职自我鉴定
2014/02/26 职场文书
共产党员承诺书
2014/03/25 职场文书
法定代表人资格证明书
2014/09/11 职场文书
护士2014年终工作总结
2014/11/11 职场文书