目录
第4章 Numpy基础:数组与向量化计算
对于大多的数据分析应用,本书作者主要关注的内容为:
·在数据处理、清洗、构造子集、过滤、变换以及其他计算中进行快速的向量化计算。
·常见的数组算法,如sort、unique以及set操作等。
·高效的描述性统计和聚合/概述数据。
·数据排列和相关数据操作,例如对异构数据进行merge和join。
·使用数组表达式来表明条件逻辑,代替if-elif-else条件分支的循环。
·分组数据的操作(聚合、变换以及函数式操作)。
Numpy重要的原因:
·它的设计对于含有大量数组的数据非常有效。
·Numpy在内部将数据存储在连续的内存块中,这与其他的Python内建数据结构是不同的。Numpy的算法库是用C语言编写的,所以在操作数据内存时,不需要任何类型检查或者其他管理操作。Numpy数组使用的内存量也小于其他Python内建序列。
·Numpy可以针对全量数组进行复杂计算而不需要写Python循环。
4.1 Numpy ndarray:多维数组对象
Numpy的核心特征之一就是N维数组对象-ndarray。ndarray是Python中的一个快速、灵活的大型数据集容器。数组允许使用类似于标量的操作语法在整块数据上进行数学计算。
一个ndarray是一个通用的多维同类数据(包含的每一个元素均为相同类型)容器。,每一个树组都有一个shape属性(用来表征每一维度的数量),每一个数组都有一个dtype属性(用来描述数组的数据类型)。
ndarray(数组、Numpy数组、ndarray对象)
4.1.1 生成ndarray
使用array函数生成数组。array函数接收任意的序列型对象,生成一个新的包含传递数据的Numpy数组。例如:
嵌套序列,例如同等长度的列表,会自动转换为多维数组:
给定长度及形状后,使用zeros创建全0数组。使用ones创建全1数组。empty可以创建一个没有初始化数值的数组。若创建高维数组,则需要为shape传递一个元祖:
下表展示标准数组的生成函数。Numpy专注于数值计算,如果没有特别指明,则默认的数据类型是float64(浮点型):
4.1.2 ndarray的数据类型
数据类型,即dtype(Numpy能够与其他系统数据灵活交换的原因),是一个特殊的对象,包含了ndarray需要为某一种类型数据所申明的内存块信息(也称为元数据,即表示数据的数据):
Numpy数据类型:
使用astype方法显式地转换数组的数据类型:将浮点数转换为整数的时候,不会进行四舍五入的操作,会直接舍弃小数点之后的数字。注意数据类型需要加上“np.”
使用astype时总是生成一个新的数组。
4.1.3 Numpy数组算术
任何在两个等尺寸数组之间的算术操作都是逐元素操作的形式:
带有标量的算术操作,会把计算参数传递给数组的每一个元素:
同尺寸的数组进行比较,会产生一个布尔值数组:
4.1.4 基础索引与切片
Numpy数值索引与Python列表看起来类似,如果传入了一个数值给数组,数值被传递了整个切片,区别于Python的内建列表,数组的切片是原数组的视图。意味着数组并不是被复制了,任何对于视图的修改都会反映到原数组中:
不写切片值的[:]将会引用数组的所有值:
拷贝数组切片而不是一份视图,就必须显式的复制这个数组:
对于高维数组,每个索引值对应的元素是一个数组:
在多维数组中,可以省略后序索引值,返回的对象将是降低一个维度的数组,例如在一个2*2*3(理解为2个2*3的数组)的数组中:
标量和数组都可以传递给arr3d:
类似的arr3d[1,0]或者arr3d[1][0]返回的是一个一维数组:
注意:上述的数组子集选择中,返回的数组都是视图。
数组的切片索引:
4.1.5 布尔索引
布尔值数组的长度必须和数组轴索引长度一致。
当布尔值数组的长度不正确时,布尔值选择数据的方法并不会报错,注意使用。
可以使用!=或者在条件前边使用~对条件取反:~符号可以对通用条件进行取反
当需要选择三个名字中的两个时,可以对多个布尔值条件进行联合使用操作符&->and和|->or:
使用布尔值索引进行选择数据时,总是生成数据的拷贝,即使返回的数组并没有任何变化。
4.1.6 神奇索引
神奇索引是Numpy中的术语,用于描述使用整数数组进行数据索引。
传递多个索引数组情况,会根据每个索引元祖对应的元素选出一个一维数组:
注意:神奇索引与切片不同,神奇索引总是将数据复制到一个新的数组中 。
4.1.7 数组转置和换轴
转置是一种特殊的数据重组方式,可以返回底层数据的视图而不需要复制任何内容。
数组有transpose方法和特殊的T属性:
对于更高维度的数组,transpose方法可以接收包含轴编号的元祖,用于置换轴:下图所示,对第一个轴和第二个轴进行置换:
解释:这里的轴转换为(x,y,z)->(y,x,z)
例如:数组中的4和8交换位置,就是(0,1,0)->(1,0,0)
ndarray有一个swapaxes方法交换轴,该方法接收一对轴编号作为参数,并对轴调整进行重组数据:
注意:wapaxes方法返回的是数据的视图,而没有对数据进行复制。
4.2 通用函数:快速的逐元素数组函数
通用也可以称为ufunc,是一种在ndarray数据中进行逐元素操作的函数。
一元通用函数,例如:
二元通用函数,会接收两个数组并返回一个数组作为结果:
也有一些通用函数返回多个数组,如modf:返回一个浮点值数组的小数部分和整数部分:
一元通用函数: