详解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实现封装得到virustotal扫描结果
Oct 05 Python
Python实现从订阅源下载图片的方法
Mar 11 Python
在Python的Django框架中创建语言文件
Jul 27 Python
python 链接和操作 memcache方法
Mar 04 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
详解Django 中是否使用时区的区别
Jun 14 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
python re模块匹配贪婪和非贪婪模式详解
Feb 11 Python
Python+pyaudio实现音频控制示例详解
Jul 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
dedecms模板标签代码官方参考
2007/03/17 PHP
smarty的保留变量问题
2008/10/23 PHP
PHP的博客ping服务代码
2012/02/04 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
javascript网页关键字高亮代码
2008/07/30 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
Python正规则表达式学习指南
2016/08/02 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
Python super()函数使用及多重继承
2020/05/06 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
有关爱国演讲稿
2014/05/07 职场文书
大气污染防治方案
2014/05/19 职场文书
安全生产承诺书范文
2014/05/22 职场文书
党校党性分析材料
2014/12/19 职场文书
党员个人年度总结
2015/02/14 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
团支部书记竞选稿
2015/11/21 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
delete in子查询不走索引问题分析
2022/07/07 MySQL