详解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正则表达式介绍
Aug 06 Python
Python json模块使用实例
Apr 11 Python
python实现杨辉三角思路
Jul 14 Python
python放大图片和画方格实现算法
Mar 30 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
python与字符编码问题
May 24 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
python zip()函数使用方法解析
Oct 31 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
Python3.7安装pyaudio教程解析
Jul 24 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 Python
Python3.9.1中使用match方法详解
Feb 08 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图片的二进制转换实现方法
2014/12/15 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python Tkinter简单布局实例教程
2014/09/03 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
金融专业毕业生自荐信
2014/06/26 职场文书
政府四风问题整改措施
2014/10/04 职场文书
党员批评与自我批评
2014/10/15 职场文书
五一劳动节慰问信
2015/02/14 职场文书
水电施工员岗位职责
2015/04/11 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript