人工智能之Python系列:Numpy库
一、引言
NumPy库是用于科学计算的一个开源Python扩充程序库,是其他数据分析包的基础包,它为Python提供了高性能数组和矩阵运算处理能力。
二、ndarray多维数组
ndarray对象是一个快速而灵活的数据集容器。主要讲解ndarray多维数组的创建方法、数组属性和数组的简单操作等。
2.1 创建ndarray数组
通过Numpy库的array函数,即可创建ndarray数组。NumPy库能将序列数据(列表、元组、数组或其他序列类型)转换为ndarray数组。如图所示:
对于多维数组的创建,使用嵌套序列数据即可完成,如图所示:
通常来说,ndarray是一个通用的同构数据容器,即其中的所有元素都需要是相同的类型。当创建好一个ndarray数组时,同时会在内存中存储ndarray的shape和dtype。shape是ndarray维度大小的元组,dtype是解释说明ndarray数据类型的对象,如图所示:
Δ注意:也可以通过显示说明,给数组指定数据类型。
除了可以使用np.array创建数组外,NumPy库还有一些函数可创建一些特殊的数组。
- zeros函数
zeros函数可以创建指定长度或形状的全0数组。如图:
- ones函数
ones函数可以创建指定长度或形状的全1数组。如图:
- empty函数
empty函数可以创建一个没有具体值得数组(即垃圾值),如图:
- arange函数
arange函数类似于Python的内置函数range,但是arange函数主要用于创建数组,如图:
更多的数组创建函数如下表:
函数 | 使用说明 |
---|---|
arange | 类似于内置的range函数,用于创建数组 |
ones | 创建指定长度或形状的全1数组 |
ones_like | 以另一个数组为参考,根据其形状的dtype创建全1数组 |
zeros、zeros_like | 类似于ones、ones_like,创建全0数组 |
empty、empty_like | 同上、创建没有具体指的数 |
eye、identity | 创建正方形的N*N单位举证 |
one_like函数用法,one_like函数可以根据传入的数组形状和dtype创建全1数组:
2.2 ndarray对象属性
Numpy创建的ndarray对象的属性,如表:
属性 | 使用说明 |
---|---|
.ndim | 秩,即数据轴的个数 |
.shape | 数组的维度 |
.size | 元素的总个数 |
.dtype | 数据的类型 |
.itemsize | 数组中每个元素的字节大小 |
2.3 ndarray数据类型
在创建数组时,NumPy会为新建的数组推断出一个合适的数据类型。同样,也可以通过dtype给创建的数组指定数据类型。
对于创建好的ndarray,可以通过astype方法进行数据类型的转换。如图
Δ注意:np.float64和‘float64’都可以进行操作。
如果将浮点数转换为整数,并不会使用四舍五入的方式来转换,而是元素的小数部分都会被截断。
如果数组时字符串类型且全为数字的话,也可以通过astype方法将其转换为数值类型。
但如果字符串中有字符时,转换就会报错。
astype方法也可以通过另外一个数组的dtype进行转换,如图:
astype方法会创建一个新的数组,并不会改变原有数组的数据类型,如图:
2.4 数组变换
- 数组重塑
对于定义好的数组,可以通过reshape方法改变其数据维度。传入的参数为新维度的元组,如图:
reshape的参数中的一维参数可以设置为-1,表示数组的维数可以通过数据本身来推断,如图:
与reshape相反的方法是数据散开(ravel)数据或扁平化(flatten),如图:
Δ注意:数据重塑不会改变原数组。 - 数组合并
数组合并用于几个数组间的操作,concatenate方法通过指定轴方向,将多个数组合并在一起,如图:
此外,NumPy中提供了几个比较简单易懂的方法,也可以进行数组合并,如vstack和hstack,如图:
- 数组拆分
数组拆分是数组合并的相反操作,通过split方法可以将数组拆分为多个数组,如图:
- 数组转置和轴对换
转置是数组重塑的一种特殊形式,可以通过transpose方法进行转置。transpose方法需要传入轴编号组成的元组,这样就完成了数组的转置。如图:
除了使用transpose方法外,数组有着T属性,可以用于数组的转置,如图:
ndarray的swapaxes方法用于轴对换,如图:
2.5 NumPy的随机数函数
在numpy.random模块中,提供可多种随机数生成函数。
函数 | 使用说明 |
---|---|
rand | 产生均匀分布的样本值 |
randint | 给定范围内取随机整数 |
randn | 产生正态分布的样本值 |
seed | 随机数种子 |
permutation | 对一个序列随机排序,不改变原数组 |
shuffle | 对一个序列随机排序,改变原数组 |
uniform(low,high,size) | 产生具有均匀分布的数组,low表示起始值,high表示结束值,size表示形状 |
normal(loc,scale,size) | 产生具有正态分布的数组,loc表示均值,scale表示标准差 |
poisson(lam,size) | 产生具有泊松分布的数组,lam表示随机事件发生率 |
三、数组的索引和切片
在数据分析中常需要选取符合条件的数据。
3.1 数组的索引
一维数组的索引类似Python列表
从代码来看,数组的切片返回的是原始数组的视图。简单地说,视图就是原始数组的表现形式,切片操作并不会产生新数据,这意味着在视图上的操作都会使原数组发生改变。
Δ注意:数组的切片和索引返回都是原始数组的视图。
如果需要的并非视图而是要复制数据,则可以通过copy方法来实现,如图:
二维、多维与一维类似。
3.2 数组的切片
一维数组的切片同样类似于Python列表,如图:
多维数组的切片是按照轴方向进行的,当在中括号中输入一个参数时,数组就会按照0轴(也就是第一轴)方向进行切片,如图
通过传入多个参数(可以是整数索引和切片),即可完成任意数据的获取,如图:
3.3 布尔型索引
首先创建两个数组,如图
如果每个水果对应datas数组中的每一行,我们要选取‘pear’对应的datas的行,这时就需要用到布尔选择器,如图
Δ注意:布尔型数组的长度必须和被索引的轴长度一致。
既然可以使用布尔选择,那么也同样适用于不等号(!=)、负号(-)、和(&)、或(|)。如图:
此外,布尔数组也可以结合切片和索引来使用,如图
通过以下代码可以完成datas数组中的0值替换为1值,如图
3.4 花式索引
花式索引是NumPy中的术语,它可以通过整数列表或数组进行索引,也可以使用np.ix_函数完成同样的操作,如图:
四、数组的运算
数组的运算支持向量化运算,将本来需要在Python级别进行的循环,放到C语言的运算中,明显提高了程序的运算速度。
4.1 数组和标量间的运算
数组之所以很强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化。相同维度的数组的算术运算都可以直接应用到元素中,也就是元素级运算。
4.2 通用函数
通用函数(ufunc)是一种对数组中的数据执行元素级运算的函数,用法也很简单。例如:通常abs函数求绝对值,square函数求平方。以上函数都是传入一个数组,所以这些函数都是一元函数。有一些函数需要传入两个数组并返回一个数组,这些函数被称为二元函数。例如:add函数用于两个数组的相加,minimum函数可以计算元素最小值。有些通用函数还可以返回两个数组,例如modf函数,可以返回数组元素的小数和整数部分。
Δ注意:更多通用函数的用法,可以去NumPy官网http://www.numpy.org/查阅
4.3 条件逻辑运算
首先创建3个数组,如图
如果需要通过cond的值来选取arr1和arr2的值,当cond为True时,选取arr1的值,否则选择arr2的值,那么可以通过if语句判断来实现,如图:
但这种方法存在连个问题:第一,对大规模数组处理速度不是很快;第二,无法用于多维数组。若使用NumPy的where函数则可以解决这两个问题,如图:
where函数中的第二个和第三个参数可以是标量。在数据分析中,经常需要通过一些条件将数组进行处理。例如,新建一个随机符合正态分布的数组,通过数据处理将正值替换为1,负值替换为-1,如图:
使用elif函数可以进行多条件的判断。np.where函数通过嵌套的where表达式也可以完成同样的功能,如图:
4.4 统计运算
NumPy库支持对整个数组或按指定轴向的数据进行统计计算。例如:sum函数用于求和,mean函数用于求算术平均值,std函数用于求标准差,如图:
上面的这些函数也可以传入axis参数,用于计算指定轴方向的统计值,如图:
cumsum和cumpod方法会产生计算结果组成的数组,如图:
基本数组的统计方法如表:
方法 | 使用说明 |
---|---|
sum | 求和 |
mean | 算数平均值 |
std、var | 标准差和方差 |
min、max | 最小值和最大值 |
argmin、argmax | 最小和最大元素的索引 |
cumsum | 所有元素的累加值 |
cumprod | 所有元素的累计积 |
4.5 布尔型数组运算
对于布尔型数组,其布尔值会被强制转换为1(True)和0(False),如图:
另外,还有两个方法any和all也可以用于布尔型数组运算。any方法用于测试数组中是否存在一个或多个True;all方法用于检查数组中的所有值是否为True。如图:
4.6 排序
与Python列表类似,NumPy数组也可以通过sort方法进行排序,如图:
对于多维数组,可以通过指定轴方向进行排序,如图:
4.7 集合运算
NumPy库提供了针对一维数组的基本集合运算。在数据分析中,常使用np.unique方法来找出数组中的唯一值,如图:
Δ注意:对唯一值进行了排序
np.in1d方法用于测试几个数组中是否包含相同的值,返回一个布尔值数组,如图:
数组的集合运算如表:
方法 | 使用说明 |
---|---|
unique(x) | 唯一值 |
intersect1d(x,y) | 公共元素 |
union1d(x,y) | 并集 |
4.8 线性代数
前面的运算时元素级的,数组相乘的结果是各对应元素的积组成的数组。而对于矩阵而言,需要求的是点积,这里Numpy库提供了用于矩阵乘法的dot函数。如图:
对于更多的矩阵计算,可通过Numpy库的linalg模块来完成。
如图,为计算矩阵的行列式:
Δ注意:更多的矩阵运算说明可查看linalg帮助。
五、数组的存取
5.1 数组的存储
通过np.savetxt方法可以对数组进行存储,具体实现如图:
5.2 数组的读取
对于存储的文件,可以通过np.loadtxt方法进行读取,并将其加载到一个数组中,如图:
结束
补充:
①轴向问题
举例以下数据:
沿横轴分割数组:
沿纵轴分割数组:
说明:从哪个轴入手,就相当于切割该轴。例如:以行为轴,就是切割行生成列数据。
所以以下例子就好理解了。
返回每列最大值:
返回每行最小值:
②找出两个一维数组中相同的元素
③标准化
使用 NumPy 计算变量直接的相关性系数: