详解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随机生成指定长度密码的方法
Apr 04 Python
Python中操作文件之write()方法的使用教程
May 25 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
dataframe设置两个条件取值的实例
Apr 12 Python
python用match()函数爬数据方法详解
Jul 23 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
详解Python实现进度条的4种方式
Jan 15 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
Pytorch实验常用代码段汇总
Nov 19 Python
Python机器学习之底层实现KNN
Jun 20 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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
javascript时间函数大全
2014/06/30 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
浅谈node模块与npm包管理工具
2018/01/03 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
python实现简单中文词频统计示例
2017/11/08 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
中学生旷课检讨书500字
2014/10/29 职场文书
Python加密技术之RSA加密解密的实现
2022/04/08 Python