- Python机器学习算法与实战
- 孙玉林 余本国
- 4450字
- 2025-02-18 02:36:38
1.4 Python基础库入门实战
对Python的基础内容有了一定的认识后,本节将主要介绍Python中的常用第三方库。这些库都是实现了各种计算功能的开源库,它们极大地丰富了Python的应用场景和计算能力,这里主要介绍NumPy、pandas和Matplotlib三个库的基础使用。其中NumPy是Python用来进行矩阵运算、高维度数组运算的数学计算库;pandas是Python用来进行数据预处理、数据操作和数据分析的库;Matplotlib是简单易用的数据可视化库,包含了丰富的数据可视化功能。接下将会逐个介绍这些库的简单应用。
1.4.1 NumPy库应用入门
NumPy库提供了很多高效的数值运算工具,在矩阵运算等方面提供了很多高效的函数,尤其是N维数组,在数据科学等计算方面应用广泛。接下来将简单介绍NumPy库的相关使用。
为了使用方便,导入NumPy库时可使用别名np代替,本书中的NumPy库均使用np作为别名。

导入NumPy库之后,针对该库的入门使用,将会分为数组生成、数组中的索引与数组中的一些运算函数三个部分进行介绍。
1.数组生成
利用NumPy库生成数组有多种方式,例如,可使用array()函数生成一个数组。

上面的程序中,使用np.array()函数将列表生成数组,并且可以利用数组A的shape属性查看其形状,使用ndim属性查看数组的维度。
在NumPy库中可以使用np.zeros()函数生成指定形状的全0数组,使用np.ones()函数生成指定形状的全1数组,np.eye()函数生成指定形状的单位矩阵(对角线的元素为1)。


使用np.array()函数生成数组的时候,可以使用dtype参数指定其数据类型,例如使用np.float64指定数据为64位浮点型,使用np.float32指定数据为32位浮点型,使用np.int32指定数据为32位整型。同时也可以使用数组的astype()方法,修改数据类型。相关示例如下:

2.数组中的索引
数组中的元素,可以利用切片索引来获取,其中索引可以是获取一个元素的基本索引,也可以是获取多个元素的切片索引,以及根据布尔值获取元素的布尔索引。使用切片获取元素的相关程序如下:


在NumPy库中还可以使用np.where找到符合条件的值函数,找到符合条件值的位置,如输出满足条件的行索引和列索引,并且也可以指定满足条件时输出的内容,与不满足条件时输出的内容。相关程序示例如下:


针对获得的数组可以使用*.T方法获取其转置,同时针对数组的轴可使用transpose()函数对数组的轴进行变换,如将3×4×2的数组转化为2×4×3的数组,相关程序如下:

3.数组中的一些运算函数
在NumPy库中已经准备了很多进行数组运算的函数,如计算数组的均值可以使用mean()函数,计算数组的和可以使用sum()函数,计算累加和可以使用cumsum()函数,相关程序如下:


数组的标准差和方差在一定程度上反映了数据的离散程度,可以通过std()函数计算标准差,使用var()函数计算方差。同时最大值可以使用max()函数,最小值可以使用min()函数进行计算。

随机数是机器学习中经常使用的内容,所以NumPy库提供了很多生成各类随机数的方法,其中设置随机数种子,可以使用np.random.seed()函数,它可以保证在使用随机数函数生成随机数时,随机数是可重复出现的。
生成服从正态分布的随机数可以使用np.random.randn()函数,生成0~n整数的随机排序可以使用np.random.permutation(n)函数,生成服从均匀分布的随机数可以使用np.random.rand()函数。在指定的范围生成随机整数可以使用np.random.randint()函数。这些函数的使用示例如下:

NumPy中还提供了保存和导入数据的函数np.save()和np.load(),其中np.save()通常是将一个数组保存为.npy文件,若要保存多个数组,可以使用np.savez()函数,并且可以为每个数组指定名称,方便导入数组后对数据的获取,相关程序如下:


1.4.2 pandas库应用入门
pandas库在数据分析中是非常重要和常用的库,它利用数据框让数据的处理和操作变得简单和快捷,在数据预处理、缺失值填补、时间序列、可视化等方面都有应用。接下来简单介绍pandas的使用方法,包括如何生成序列和数据表格、数据聚合与分组运算及数据可视化功能等。pandas库在导入后经常使用pd来代替。

1.序列和数据表
pandas库中的序列(Series)是一维标签数组,能够容纳任何类型的数据。可以使用pd.Series( data, index,…)生成序列,其中data指定序列中的数据,通常使用数组或者列表,index通常指定序列中的索引,例如使用下面的程序可以生成序列s1,并且可以通过s1.values和s1.index获取序列的数值和索引。

针对生成的序列可以通过切片和索引获取序列中的对应值,也可以对获得的数值重新赋值。相关示例如下:


通过字典也可以生成序列,其中字典的键将会作为序列的索引,字典的值将会作为序列的值,下面的s2就是利用字典生成的序列。针对序列可以使用value_counts()方法,计算序列中每个取值出现的次数。

数据表是pandas库提供的一种二维数据结构,数据按行和列的表格方式排列,是数据分析经常使用的数据展示方式。数据表的生成通常使用pd.DataFrame(data,index,columns,…)方式。其中data可以使用字典、数组等内容,index用于指定数据表的索引,columns用于指定数据表的列名。
使用字典生成数据表时,字典的键将会作为数据表格的列名,值将会作为对应列的内容。同时可以使用df1["列名"]的形式为数据表格df1添加新的列,或者获取对应列的内容。df1.columns属性则可以输出数据表格的列名。


针对数据表格df可以使用df.loc获取指定的数据,使用方式为df.loc[index_name,col_name],选择指定位置的数据。相关使用方法如下:


数据表格的df.iloc方法是基于位置的索引来获取对应的内容,相关使用方法如下:


2.数据聚合与分组运算
pandas库提供了强大的数据聚合和分组运算能力,如可以通过apply方法,将指定的函数作用于数据的行或列,而groupby方法可以对数据进行分组统计,这些功能对数据表的变换、分析和计算都非常有用。下面使用鸢尾花数据集介绍如何使用apply方法将函数应用于数据计算。


通过上面的程序可以发现利用apply方法可以使函数的应用变得简单,从而方便对数据进行更多的认识和分析。数据表的groupby方法则可进行分组统计,其在应用上比apply方法更加广泛,如根据数据的不同类型,计算数据的一些统计性质,获得数据透视表。相关使用示例如下:


数据表的聚合运算可以通过agg方法,并且该方法可以和groupby方法结合使用,从而完成更复杂的数据描述和分析工作,如可以计算不同数据特征的不同统计性质等。相关使用示例如下:

3.数据可视化函数
pandas库提供了针对数据表和序列的简单可视化方式,其可视化是基于Matplotlib库进行的。对pandas的数据表进行数据可视化时,只需要使用数据表的plot()方法,该方法包含散点图、折线图、箱线图、条形图等。下面使用数据演示一些pandas库的数据可视化方法,获得数据可视化图像。


上面的程序是使用数据表的boxplot()方法获得箱线图,同时在可视化时,可视化两列数据SepalLengthCm和SepalWidthCm变量的箱线图,再针对每个变量使用类别特征Species进行分组,最终可视化结果如图1-11所示。

图1-11 数据箱线图可视化
使用df.plot()方法对数据表进行可视化时,通常会使用kind参数指定数据可视化图像的类型,参数x指定横坐标轴使用的变量,参数y指定纵坐标轴使用的变量,其他参数调整数据的可视化结果。例如针对散点图,可以使用参数s指定点的大小,使用参数c指定点的颜色等。利用数据表获得散点图的程序如下,程序运行后的结果如图1-12所示。


图1-12 数据散点图可视化
使用df.plot()方法时,指定参数kind="hexbin"可以使用六边形热力图,对数据进行可视化,例如针对鸢尾花数据中的SepalLengthCm变量和SepalWidthCm变量的六边形热力图,可使用下面的程序进行可视化,获得如图1-13所示的结果。


图1-13 数据六边形热力图
可视化时指定参数kind="line",可以使用折线图对数据进行可视化,例如针对鸢尾花数据中的4个变量的变化情况,可使用下面的程序进行拆线图可视化,程序运行后的结果如图1-14所示。


图1-14 数据折线图可视化
pandas的入门内容先介绍到这里,更多内容可以参考官方文档进行探索和学习。下面介绍如何使用Matplotlib。
1.4.3 Matplotlib库应用入门
Matplotlib是Python的绘图库,其具有丰富的绘图功能,pyplot是其中的一个模块,它提供了类似MATLAB的绘图接口,能够绘制2D、3D等丰富图像,是数据可视化的好帮手,接下来简单介绍其使用方法。
首先利用Matplotlib库进行绘图的一些准备工作。

上面的程序中首先导入Matplotlib中的pyplot模块,并命名为plt,为了在Jupyter Notebook中显示图像,需要使用%matplotlib inline命令;为了绘制3D图像,需要引入三维坐标系Axes3D。由于Matplotlib库默认不支持中文文本在图像中的显示,为解决这个问题,可以使用matplotlib.rcParams['axes.unicode_minus']=False语句,同时导入seaborn数据可视化库,使用其set()方法可以设置可视化图像时的基础部分,例如font="Kaiti"参数指定图中文本使用的字体,参数style="ticks"设置坐标系的样式,参数font_scale设置字体的显示比例等。
1.二维可视化图像
在介绍Matplotlib库的二维数据可视化之前,先展示一个简单的曲线可视化示例,程序如下:

上面的程序中,首先生成X、Y坐标数据,然后使用plt.figure()定义一个图像窗口,并使用figsize=(10,6)参数指定图像的宽和高;plt.plot()绘制图像对应的坐标为X和Y,其中第三个参数“r-*”代表绘制红色曲线星形图,plt.xlabel()定义X坐标轴的标签名称,plt.ylabel()定义Y坐标轴的标签名称,plt.title()指定图像的名称,plt.grid()代表在图像中显示网格线,最后使用plt.show()查看图像。得到的图像如图1-15所示。

图1-15 简单的曲线图可视化
Matplotlib库还可以在一个图像上绘制多个子图,从多方面、多角度对数据进行观察。下面展示如何可视化出一个图像中包含3个子图的示例,程序如下:

在这个例子中,分别绘制了曲线图、直方图、阶梯图3个子图。plt.subplot(2,2,1)表示将当前图形窗口分成2×2=4个区域,并在第1个区域上进行绘图。在第一幅子图中指定X轴名称时,使用plt.xlabel(r"$\alpha$")来显示,其中 "$\alpha$" 表示LaTeX公式。plt.subplot(2,2,2)表示开始在第2个区域上绘制图像,plt.hist(histdata, 10)表示将数据histdata分成10份来绘制直方图。而在可视化第三个子图时,使用plt.subplot(2,1,2)表示将图形区域重新划分为2×1=2个窗口,并且指定在第2个窗口上作图,这样原始的2×2的4个子图的第3个和第4个子图,组合为一个新的子图窗口。plt.step(X,Y,c="r",label="sin(x)",linewidth=3)为绘制阶梯图,并且指定线的颜色为红色,线宽为3;plt.legend(loc="lower right",fontsize=16)可以为图像在指定的位置添加图例,字体大小为16;plt.xticks(xtick,xticklabel,rotation=45)是通过plt.xticks()来指定坐标轴X轴的刻度所显示的内容,并且可通过rotation=45将其逆时针旋转45°;plt.subplots_adjust(hspace=0.35)为调整子图之间的水平间距,让子图之间没有遮挡,最终的数据可视化结果如图1-16所示。

图1-16 多个子图窗口可视化
2.三维可视化图像
Matplotlib库还可以绘制三维图像,下面给出绘制三维图像曲面图和空间散点图的例子,程序如下:


上面的可视化程序中,先使用np.meshgrid()函数准备数据可视化需要的网格数据,然后针对图像窗口使用fig.add_subplot(111, projection= "3d")初始化一个3D坐标系ax1,接着使用ax1.plot_surface()函数绘制曲面图,使用ax1.contour()函数为图像添加等高线,最后设置了各个坐标轴的标签和可视化范围,可视化结果如图1-17所示。

图1-17 3D曲面和等高线图可视化
同样在一副图像中可以绘制多个3D图像,可视化3D曲线图和3D散点图的程序如下:


上面的程序在可视化3D图像时使用的是3个一维向量数据,分别指定x、y和z轴的坐标位置,然后可视化3D曲线图和3D散点图,程序运行后的结果如图1-18所示。

图1-18 3D曲面图与3D散点图
3.可视化图片
针对图像数据,可以使用plt.imshow()函数进行可视化,同时针对灰度图像,可以使用参数cmap=plt.cm.gray定义图像的颜色映射,针对一张图片可视化RGB图像和灰度图像的程序如下:


运行上面的程序后结果如图1-19所示,分别是RGB图像和绘图图像的可视化。

图1-19 可视化图片数据
Matplotlib库中,包含很多的数据可视化内容,上面的内容只是其中的一小部分,更多的可视化方法会在后面的章节中介绍,也可以参看官方的帮助文档进行学习。