详解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 25 Python
Python 3中print函数的使用方法总结
Aug 08 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
Python编程在flask中模拟进行Restful的CRUD操作
Dec 28 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
Python PyCharm如何进行断点调试
Jul 05 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
Python中if有多个条件处理方法
Feb 26 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
Python list和str互转的实现示例
Nov 16 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缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
Python网络编程详解
2017/10/31 Python
python3爬取各类天气信息
2018/02/24 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
Python求凸包及多边形面积教程
2020/04/12 Python
python主要用于哪些方向
2020/07/05 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
C语言笔试题
2014/09/04 面试题
机电一体化自荐信
2013/12/10 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
小学生暑假感言
2014/02/06 职场文书
优秀员工演讲稿
2014/05/19 职场文书
现役军人家属慰问信
2015/03/24 职场文书
银行实习推荐信
2015/03/27 职场文书
员工升职自荐信
2015/03/27 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
mysql函数之截取字符串的实现
2022/08/14 MySQL