详解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脚本快速为iOS10生成图标和截屏
Sep 22 Python
python实现人脸识别代码
Nov 08 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
Python 内存管理机制全面分析
Jan 16 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
Python绘制数码晶体管日期
Feb 19 Python
用Python简陋模拟n阶魔方
Apr 17 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中对数据库操作的封装
2006/10/09 PHP
利用PHP和AJAX创建RSS聚合器的代码
2007/03/13 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
javascript 打印页面代码
2009/03/24 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
2013/11/01 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
js动态生成表格(节点操作)
2021/01/12 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Django实现分页显示效果
2019/10/31 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
python一些性能分析的技巧
2020/08/30 Python
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
银行会计职员个人的自我评价
2013/09/29 职场文书
大学生个人简历中的自我评价
2013/12/27 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
四群教育工作实施方案
2014/03/26 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python