详解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之做一个小游戏
Sep 28 Python
Python数据结构之Array用法实例
Oct 09 Python
Python中的ceil()方法使用教程
May 14 Python
在Python中操作字典之update()方法的使用
May 22 Python
Python素数检测实例分析
Jun 15 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
django js实现部分页面刷新的示例代码
May 28 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
Pytest mark使用实例及原理解析
Feb 22 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
Django基于客户端下载文件实现方法
Apr 21 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操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
php计算函数执行时间的方法
2015/03/20 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
python3解析库lxml的安装与基本使用
2018/06/27 Python
使用python模拟命令行终端的示例
2019/08/13 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
计算机毕业生自荐信范文
2014/03/23 职场文书
单位承诺书格式
2014/05/21 职场文书
2014财务年度工作总结
2014/11/11 职场文书
2014年纪委工作总结
2014/12/05 职场文书
召开会议通知范文
2015/04/15 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
Python的property属性详细讲解
2022/04/11 Python