NumPy 学习 第三篇:矢量化和广播
矢量化
矢量化是指用数组表达式替换显式的for循环,在Python中循环数组或其他跟数组类似的数据结构时,使用循环会涉及很多开销。NumPy中的矢量化操作把内部循环委托给高度优化的C和Fortran函数,从而实现更清晰,更快速的Python代码。
矢量化是NumPy中的一种强大功能,可以把操作表达为“在整个数组上而不是在各个元素上”发生,Python内部隐式对数组的各个元素执行相同的操作。
矢量化对每个元素执行相同的操作,对于原生的Python代码,举一个简单的例子,考虑将1维数组中的每个元素与相同长度的另一个序列中的相应元素相乘的情况。如果数据存储在两个Python 列表 a
和 b
中,我们可以迭代每个元素,如下所示:
c = []
for i in range(len(a)):c.append(a[i]*b[i])
当涉及到 ndarray 时,逐个元素的操作是“默认模式”:
c = a * b
广播
两个形状相同的NumPy数组之间的操作是按元素操作的,对于大小不同的数组,按照广播规则来进行。广播(Broadcasting)描述了 numpy 如何在算术运算期间处理具有不同形状的数组。
1,广播的原理
NumPy 通常在数组的每个元素上执行相同的操作,在最简单的情况下,两个数组具有完全相同的形状,如下例所示,a和b都是数组,对数组执行相乘操作,Python内部执行的操作是对位置相同的元素执行相乘操作:
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = np.array([2.0, 2.0, 2.0])
>>> a * b
array([ 2., 4., 6.])
当数组的形状满足某些约束时,NumPy的广播规则放宽了这种约束。当一个数组和一个标量值在一个操作中组合时,会发生最简单的广播示例,a是数组,b是标量:
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = 2.0
>>> a * b
array([ 2., 4., 6.])
结果等同于前面的示例,在算术运算期间,想象b是被拉伸成跟
数组a的形状相同的数组,数组b的每个元素都是2.0
。
拉伸类比只是概念性的,NumPy足够聪明,可以使用原始标量值而无需实际构造数组。
2,广播规则
为了进行广播,在操作中两个阵列的末尾维度的尺寸必须相同,或者必须有一个维度的尺寸是相同的。
举个例子,数据a的shape是(4,3),数组b的shape是(1,3),两个数组的末尾维度是2,形状是兼容的:
技术细节:较小的数组会在较大的数组中“广播”,以便它们具有兼容的形状。
广播规则:广播使用以下2个规则处理具有不同形状的两个数组:
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
- 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值,也就是说,在任何一个维度上,如果一个数组的维度为1,另一个数组的维度大于1,那么在该维度上,就好像是对第一个数组进行了复制。
简单理解:对两个数组,分别比较它们的每一个维度(若其中一个数组没有当前维度则忽略),满足以下三个条件:
- 数组拥有相同形状。
- 当前维度的值相等。
- 当前维度的值有一个是 1。
若条件不满足,抛出 "ValueError: frames are not aligned" 异常。
参考文档:
NumPy 矢量化
NumPy 广播
Array Broadcasting in Numpy
NumPy 学习 第三篇:矢量化和广播相关推荐
- 对比python字符串函数,学习pandas的str矢量化字符串函数
1.概述 python字符串应该是python里面最重要的数据类型了,因此学会怎么处理各种各样的字符串,显得尤为重要. 我们不仅要学会怎么处理单个字符串,这个就需要学习"python字符串函 ...
- 保安日记:前端学习第三篇之CSS选择器
前端第三篇 Emmet语法 快速生成HTML标签 快速生成CSS样式 1.比如w200按tab 可以生成width: 200px; 2.比如lh26按tab可以生成line-height:26px; ...
- c语言课程设计文献检索,文献检索课学习心得三篇(2)
文献检索课学习心得 篇[3] 内容提要:通过本次文献信息检索课程的学习,有利于培养我们的信息意识.自学意识和知识创新能力,使我们养成了自主学习的习惯和独立获取信息的能力,了解了信息社会中文献信息检索的 ...
- SOM网络(Kohonen自组织网络)学习第三篇
SOM算法学习自组织映射算法是一种无监督学习方法,具有良好的自组织.可视化等特性,已经得到了广泛的应用和研究.作为一种聚类和高维可视化的无监督学习算法,是通过模拟人脑对信号处理得到的一种人工神经网络. ...
- 小白入门深度学习 | 第三篇:30分钟入门深度学习 - TensorFlow版
文章目录 一.深度学习是什么 二.实现过程 1. 准备数据 2. 构建神经网络模型 3. 编译模型 4. 训练模型 5. 预测 三.总结 课后练手项目(附代码+讲解)
- python之numpy基础_Python之NumPy学习(基础篇)
NumPy(NumericalPython的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然的使用数组和矩阵.NumPy包含很多实用的数学函数,涵盖线性代数运算.傅里叶变换和随机 ...
- Linux学习第三篇--Linux的文件系统
重点 对于Linux系统来说,无论是程序或者配置亦或是其他的组件,都是一个文件! 和java的一切皆对象相似,linux一切皆文件. 硬件装置在linux中的文件名 上文已经说过,在linux中一切皆 ...
- 深度学习(三)结构化机器学习项目-机器学习策略2 -Andrew Ng
一.机器学习策略(2) 1.1 进行误差分析 如果你希望让学习算法能够胜任人类能做的任务,但你的学习算法还没有达到人类的表现,那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么.这个过 ...
- 最简易上手的numpy学习笔记三
1 数组的复制 2 改变数组的维度 改变这些数组的维度,包含提高数组的维度和降低数组的维度,还包括数组的转置. 通过reshape方法可以将一维数组变成二维.三维或者多维数组.通过ravel方法或fl ...
最新文章
- 达摩院发布2022十大科技趋势!
- python dict 字典 清空
- iOS 项目中包含多个 FFMPEG 方法冲突的通用解决办法。
- java 整型数组排序,java整型数组冒泡排序
- 大数据-操作HDFS的基本命令
- React中JSX的理解
- 常用NTP网络时间服务器整理
- 阿里文娱搜索排序算法实践和思考(附交流视频和PPT下载链接)
- R语言︱集合运算——小而美法则
- 用VIM编写C/C++程序
- 专利证书下载-不是标准的IE浏览器-解决办法
- 系统时间无法同步 rpc服务器不可用,win7系统时间同步出错RPC服务器不可用的解决手段...
- CCRC信息安全服务资质审核费用是多少?
- 蓝牙篇之蓝牙核心规范学习笔记(V5.3)汇总
- 大数据技术具备哪些特点
- 逃离僵尸岛【最短路】
- useradd 与adduser的区别
- python standardprint_Python 机器学习 标准差(Standard Deviation)
- 计算机结构体系:循环展开题型 (非凭感觉的方法详解)
- 拜占庭将军问题与PBFT算法和POW共识