详解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函数式编程指南(一):函数式编程概述
Jun 24 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
Python处理XML格式数据的方法详解
Mar 21 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
python用插值法绘制平滑曲线
Feb 19 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
Django之全局使用request.user.username的实例详解
May 14 Python
python定义类的简单用法
Jul 24 Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
php自动加载autoload机制示例分享
2014/02/20 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
python实现图片压缩代码实例
2019/08/12 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
《落花生》教学反思
2014/02/25 职场文书
护校行动方案
2014/05/31 职场文书
自我管理的活动方案
2014/08/25 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
护理工作心得体会
2016/01/22 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书