**
**
2.1:ndarray多维数组
2.1.1:创建ndarray数组
通过NumPy库的array函数,即可轻松地创建ndarray数组。NumPy库能将序列数据(列表,元组、数组或其他序列类型)转换为ndarray数组。
在使用前需要引入numpy库:import numpy as np
语法:np.array(data)
参数说明:data为需要转换为ndarray数组的序列
通常来说,ndarray是一个通用的同构数据容器,即其中的所有元
素都需要是相同的类型。当创建好一个ndarray数组时,同时会在
内存中存储ndarray的shape和dtype。
shape:ndarray维度大小的元组。
dtype:解释说明ndarray数据类型的对象。
NumPy库还有一些函数可以创建一些特殊的数组。
2.1.2:ndarray对象属性
2.1.3:ndarray数组类型
在创建数组时,NumPy会为新建的数组推断出一个合适的数据类型。同样也可以通过dtype给创建的数组指定数据类型。
数组的数据类型有很多,只需要记住最常见的几种数据类型即可,如浮点数(float)、整数(int)、复数(complex)、布尔值(bool)、字符串(string_)和Python对象(object)。
对于创建好的ndarray,可通过astype方法进行数据类型的转换。
语法:arr.astype(np.float64|'float64')
说明:arr:ndarray数组
2.1.4:数组转换
arr.reshape((x,y))
arr.ravel()
arr.flatten()
np.concatenate([arr1, arr2], axis=0|1)
np.vstack((arr1, arr2))
np.hstack((arr1, arr2))
np.split(arr, indices_or_sections, axis=0)
ndarray的swapaxes方法用于轴对换。
2.1.5:NumPy的随机数函数
2.2 数组的索引和切片
2.2.1:数组的索引
一维数组的索引类似Python列表。
数组的切片返回的是原始数组的视图。简单地说,视图就是原始数组的表现形式,切片操作并不会产生新数据,这就意味着在视图上的操作都会使原数组发生改变。
如果需要的并非视图而是要复制数据,则可以通过copy方法来实现。
可以通过下图来理解轴的概念和二维数组的索引方式。在高维数组中,如果省略后面的索引,则会返回低一个维度的数组。
2.2.2: 数组的切片
一维数组的切片同样类似于Python列表。
多维数组的切片是按照轴方向进行的,当在中括号中输入一个参数时,数组就会按照0轴(也就是第一轴)方向进行切片。
python numpy数组中冒号的使用:
python中冒号实际上有两个意思:1.默认全部选择;2. 指定范围。
第一种意思,默认全部选择:
如,X[:,0]就是取矩阵X的所有行的第0列的元素,X[:,2] 就是取所有行的第2列的元素
第二种意思,指定范围,注意这里含左不含右
如,X[:, m:n]即取矩阵X的所有行中的第m到n-1列数据,含左不含右
2.2.3:布尔型索引
首先创建两个数组fruits、datas,假设fruits中每个水果对应于datas数组中的每一行,我们要取出“pear”对应的datas的行,就需要用到布尔选择器。
注意:布尔型数组的长度必须和被索引的轴长度一致
2.2.4:花式索引
花式索引是NumPy中的术语,它可以通过整数列表或数组进行索引。也可以使用np.ix_函数完成同样的操作。
2.3:数组的运算
2.3.1:数组和标量间的运算
标量:亦称“无向量”。有些物理量,只具有数值大小,而没有方向,部分有正负之分。物理学中,标量(或作纯量)指在坐标变换下保持不变的物理量。用通俗的说法,标量是只有大小,没有方向的量。
数组之所以很强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化。相同维度的数组的算术运算都可以直接应用到元素中,也就是元素级运算。
2.3.2:通用函数
通用函数是一种对数组中的数据执行元素级运算的函数。例如,通过abs函数求绝对值,square函数求平方。以下函数都是传入一个数组,所以这些函数都是一元函数。
有一些函数需要传入两个数组并返回一个数组,这些函数被称为二元函数。例如,add函数用于两个数组的相加,minimum函数可以计算元素最小值。
有些通用函数还可以返回两个数组,例如modf函数,可以返回数组元素的小数和整数部分。
2.3.3: 条件逻辑运算
如果需要通过cond的值来选取arr1和arr2的值,当cond为True时,选择arr1的值,否则选择arr2的值,可以通过if语句判断来实现。
创建数组:
条件逻辑:
上述方法存在两个问题:第一,对大规模数组处理速度不是很快;第二,无法用于多维数组。若使用NumPy的where函数,则可以解决这两个问题。
where函数中的第二个和第三个参数可以为标量。
在数据分析中,经常需要通过一些条件将数组进行处理。例如,新建一个随机符合正态分布的数组,通过数据处理将正值替换为1,负值替换为-1。
2.3.4:统计运算
NumPy库支持对整个数组或按指定轴向的数据进行统计计算。例如,sum函数用于求和;mean函数用于求算术平均数;std函数用于求标准差。
基本数组的统计方法如下表:
2.3.5:布尔型数组运算
对于布尔型数组,其布尔值会被强制转换为1(True)和0(False)。
另外,还有两个方法any和all也可以用于布尔型数组运算。any方法用于测试数组中是否存在一个或多个True;all方法用于检查数组中的所有值是否为True。
2.3.6:排序
与Python列表类似,NumPy数组也可以通过sort方法进行排序。
对于多维数组,可以通过指定轴方向进行排序。
2.3.7:集合运算
NumPy库中提供了针对一维数组的基本集合运算。在数据分析中,常使用np.unique方法来找出数组中的唯一值。
注意:对唯一值进行了排序。
数组的集合运算如下表所示。
2.3.8:线性代数
前面讲过数组的运算是元素级的,数组相乘的结果是各对应元素的积组成的数组。而对于矩阵而言,需要求的是点积,这里NumPy提供了用于矩阵乘法的dot函数。
矩阵乘法解释:
2.4 数组的存取
2.4.1:数组的存储
通过np.savetxt方法可以对数组进行存储。参数介绍如下:
np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n',
header='', footer='', comments='# ', encoding=None)
fname:文件名/文件路径,如果文件后缀是.gz,文件将被自动保存为.gzip格式,np.loadtxt可以识别该格式:
X:要存储的1D或2D数组
fmt:控制数据存储的格式
delimiter:数据列之间的分隔符
newline:数据行之间的分隔符
header:文件头部写入的字符串
footer:文件底部写入的字符串
comments:文件头部或者尾部字符串的开头字符,默认是’#’
encoding:使用默认参数
2.4.2:数组的读取
对于存储的文件,可以通过np.loadtxt方法进行读取,并将其加载到一个数组中。参数介绍如下:
np.loadtxt(fname,dtype=<class ’float'>,comments='#',delimiter=None,converters=None,skiprows=0,usecols=None,unpack=False,ndmin=0,encoding='bytes')
fname:文件名/文件路径,如果文件后缀是.gz或.bz2,文件将被解压,然后再载入
dtype:要读取的数据类型
comments:文件头部或者尾部字符串的开头字符,用于识别头部,尾部字符串
delimiter:划分读取值的字符串
converters:数据行之间的分隔符
2.5 综合示例—图像变换
图像一般采用的是RGB色彩模式,即每个像素点的颜色有R(红)、G(绿)、B(蓝)组成。通过三种颜色的叠加可以得到各种颜色,每个颜色的取值范围为0~255。Python中的PIL库是一个处理图像的第三方库。
2.6:本章总结
本章主要讲解了:ndarray数组的创建和属性,数组的切片和索引方法,数组的各类运算,数组的存储和读取,图像的处理方法.
通过本章学习,希望同学们能够掌握NumPy库中数组的创建、属性、各种操作和运算,能够使用数组进行数据分析的编程,了解图像处理方法。