详解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 提取文件的小程序
Jul 29 Python
Python时区设置方法与pytz查询时区教程
Nov 27 Python
Python break语句详解
Mar 11 Python
Python中的pprint折腾记
Jan 21 Python
Python检查ping终端的方法
Jan 26 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
Python爬虫学习之获取指定网页源码
Jul 30 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
如何理解及使用Python闭包
Jun 01 Python
详解非极大值抑制算法之Python实现
Jun 28 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
Views rows style模板重写代码
2011/05/16 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python深入学习之内存管理
2014/08/31 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Python PIL图片添加字体的例子
2019/08/22 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
python drf各类组件的用法和作用
2021/01/12 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
委托书的写法
2014/08/30 职场文书
药店营业员岗位职责
2015/04/14 职场文书
趣味运动会赞词
2015/07/22 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python