详解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开发的HTTP库requests详解
Aug 29 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
Python多项式回归的实现方法
Mar 11 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 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中利用XML技术构造远程服务(下)
2006/10/09 PHP
第四章 php数学运算
2011/12/30 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
jquery remove方法应用详解
2012/11/22 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
Python中暂存上传图片的方法
2015/02/18 Python
python结合API实现即时天气信息
2016/01/19 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
python中字典增加和删除使用方法
2020/09/30 Python
Python eval函数介绍及用法
2020/11/09 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
New delete 与malloc free 的联系与区别
2013/02/04 面试题
捐款倡议书
2014/04/14 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
主持人开幕词
2015/01/29 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书
python编写五子棋游戏
2021/05/25 Python
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
基于Python实现射击小游戏的制作
2022/04/06 Python
css弧边选项卡的项目实践
2023/05/07 HTML / CSS