详解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 ip正则式
May 07 Python
python函数局部变量用法实例分析
Aug 04 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
python 动态加载的实现方法
Dec 22 Python
python 字符串和整数的转换方法
Jun 25 Python
Python实现12306火车票抢票系统
Jul 04 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
python的命名规则知识点总结
Oct 04 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
python中对列表的删除和添加方法详解
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简单实现MVC
2015/02/05 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
详解Angular路由之路由守卫
2018/05/10 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
简单的Python2.7编程初学经验总结
2015/04/01 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
python 获取计算机的网卡信息
2021/02/18 Python
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
教师年终个人自我评价
2013/10/04 职场文书
职业生涯规划书基本格式
2014/01/06 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
感谢信模板大全
2015/01/23 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android