![Python大数据与机器学习实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/134/30638134/b_30638134.jpg)
2.3 常用函数
Numpy为科学计算设计专门提供了庞大的函数库以简化代码量并提高程序运行效率,这样可以使程序员不用再关注具体的实现细节,而有更多的时间和精力去关注程序的目标、框架和逻辑。
2.3.1 分段函数
分段函数高效简练,使用它可以将if条件选择和select分支仅通过一条语句实现对数组的处理,方便的同时还可以提高代码的可读性。
1.where函数
where函数是if/else条件选择语句对数组操作的精简写法,其语法如下:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_64_3.jpg?sign=1739486921-TUi7dnCqqmp4BPN4fVrNElRIa2ETUzVZ-0-f714fa20d6a9878bd3aa634d59577b3c)
其中,参数condition,y,z都是大小相同的数组(或用于生成数组的表达式),condition为布尔型。当其元素值为True且选择相应位置y数组的值为False时,选择数组z中的值,返回值是新值组成的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_64_4.jpg?sign=1739486921-XhNNDdZBSpbF2SfBcBQhvt6VEXtPw55d-0-cdf2148732889af1ee3b2c7180977a98)
2.select函数
当判断条件为多个时,需要多次调用where函数,而用select函数可用单个语句实现该功能,其语法如下:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_65_1.jpg?sign=1739486921-be3cDum0LcuRIac7tCWtROcCGWooezzm-0-a178497688f78c4b80dcbaa53d24589d)
其中,condlist是条件列表,choicelist是值列表,default是默认值。示例将小于3的数置为-1,3~6的置为0,大于6的置为1,例程如下:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_65_2.jpg?sign=1739486921-a2vKEfLiNauAr3UEBCEHs6IcHOKhxTmo-0-b3b84243c78199df6980d0eea6815cb5)
3.piecewise函数
piecewise函数是select函数的扩展,它不但支持按不同条件取值,还支持按条件运行不同函数或lambda表达式。其语法如下:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_65_3.jpg?sign=1739486921-Jo4sxnEjmLpWc01Ykb7Wat8GtFmOk0ai-0-3a19e43b448eed66b3f8789eb00c5fed)
语法与select函数略有不同:第一个参数是待转换数组x,第二个参数condlist是条件列表,第三个参数funclist是函数列表。当满足condlist中的条件时,执行对应位置funclist中的函数并取其返回结果。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_65_4.jpg?sign=1739486921-kZP0g1Clpn4jBMeCJHNk9isFlaNMw0wg-0-6b6b7b8f3cb175967adde5e671ded35e)
2.3.2 统计函数
本小节将介绍针对数值类型的统计函数的使用方法。
1.均值、方差、分位数
首先创建测试数组,然后计算其均值(mean)、方差(var)、标准差(std)。均值是将数组中所有值加起来除以数组个数,度量的是数组中数值的趋势,如公式(2.1)所示:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_1.jpg?sign=1739486921-6rzd7ZyNq5KHtjdJh1P5TNzLaHZJbTJP-0-84d3b30962b60fd5a429d40736038623)
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_2.jpg?sign=1739486921-3ch474uEIVy2EKAyLGCvBecZLnDdRoZB-0-c1cab4b860be5b183d052bd0191e023c)
方差是数组中各数减去均数的平方的平均数,度量的是数组中数值的离散量度,如公式(2.2)所示:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_3.jpg?sign=1739486921-tYCIuEXvQ3tuESfGmndPpmRcLtZZp0Aw-0-e8481ec824867c3ac4c51f29f6dc8f9b)
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_4.jpg?sign=1739486921-gWB2jTqpqCHZ2MghD3jEomwclwerUbWT-0-dc5183234f01a3412be3911acc7317f4)
标准差又称均方差,是方差的算术平均根,如公式(2.3)所示:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_5.jpg?sign=1739486921-aCQHdN2atXXLTUDLNduu5wGimrlZYWVO-0-ca5dbf75cc097a455f32e6d3e8a4192b)
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_6.jpg?sign=1739486921-9kJhwk5duer7cqwkqECwfHKKxB0Eg281-0-55fe6ce1149cbcae3317da2757a00d6a)
用average方法计算加权平均值,其中weights为赋予数组中每个值的权重。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_7.jpg?sign=1739486921-Ffl8cSfZySLjx6nsVRsa4GqZs1lX2vww-0-36c0c8a79811b3745aa1a3fa63cc910e)
用median方法计算中数,percentile方法计算分位数。中数是将数组排序后,位于中间位置的数。如果数组元素个数为偶数,则计算中间两数的平均值,分位数同理。例如,本例中的75分位数是排序后计算在75%位置的数值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_8.jpg?sign=1739486921-RfuuYkPQMmSuaYEQeV6kwHB6WqRdEtt3-0-b4c5ef96aac807399d5712bd15c046bf)
2.极值和排序
计算数组的最大值(max)、最小值(min),以及最大值和最小值之差(ptp)。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_9.jpg?sign=1739486921-G5O2euCCIYYlNiEkDqjsQ3G1hYSJQtdj-0-64002638c12a8aaaaac35329aacbb8a0)
用argmin方法和argmax方法获取最大值和最小值的下标。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_10.jpg?sign=1739486921-XeQWHBCBxAAc21WR1wHpJBYkprCIJ9zK-0-b372d78cab566b23d8fea1ef34514595)
用argsort方法计算每个元素排序后的下标位置。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_11.jpg?sign=1739486921-XP8zOpP1iQLA5voQUyW5fLB3fggkaGwg-0-5da5745553b7d2fbca7f3047e5f615ea)
用sort方法对数组排序,其中axis指定排序的轴,kind指定排序的算法,默认是快速排序,排序后数组内容被改变。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_66_12.jpg?sign=1739486921-NFLaoDadxXmk9HqbOFhGNtsriZT90eRt-0-27c0e4e3a09477e4d58d016d1c86ad77)
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_67_1.jpg?sign=1739486921-rB40bPYZNg6Ix70f75UKVyeMZKrfgZby-0-07f5959cc3d38fcf54631f41cbe9668e)
3.统计
首先创建测试数组,然后用unique方法统计数组中所有不同的值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_67_2.jpg?sign=1739486921-AuLklNLl6LQgO6JZZWHuXGlUCyDHzSfW-0-d137ce8392dd89e54844d0f4bde864d0)
用bincount方法统计整数数组中每个元素出现的次数。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_67_3.jpg?sign=1739486921-bBiTSpgf2dKKqPNdmIhsmllXJH0x1d9K-0-cbae9d3c51a091273f325acc4ec4566b)
用histogram方法统计一维数组数据分布直方图,用bins方法指定区间各数。函数返回两个数组:第一个数组是每个区间值的个数,第二个数组是各区间的边界位置。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_67_4.jpg?sign=1739486921-1aaSIlJl8e1pgvdg1bYPVyOeBX59QyS2-0-03f888cce50112121056e703fa7ff759)
2.3.3 组合与分割
1.组合
利用concatenate和stack系列函数可连接两个数组以创建数组。首先定义测试数组,然后使用stack函数连接两个数组,从返回结果中可以看到,连接后新数组的秩增加。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_67_5.jpg?sign=1739486921-GRHtnw1ySXEOrKVb9Z2MTbkB3qgMTgbk-0-3b1a6251ffef4c36381e36af95a16935)
column_stack方法和hstack方法的效果相似,都是沿第0轴连接数组(横向连接),而纵向连接用row_stack方法和vstack方法。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_67_6.jpg?sign=1739486921-90FLtNZE5dx3tBRJnA6CdelUlkk5qkZs-0-dd929f0a6f285d33ba52570138682ed5)
concatenate方法既可横向连接,也可纵向连接,可通过axis参数指定连接方向,是使用频率最高的数组连接方法。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_68_2.jpg?sign=1739486921-0vYlTVCcDbfCBYfySOnQq5xcL0YxE0FJ-0-120745b7a761674ac9bfbe09744d0ee7)
flatten方法和reval方法都可将多维数组展成一维,差别是flatten方法返回一份拷贝copy,当对数据更改时不会影响原来的数组,而Numpy.ravel方法返回的是视图view(view和copy的概念将在2.3.6节详述)。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_68_3.jpg?sign=1739486921-YxRQi5ORZWjeKfNiIG639XGYCB9elETT-0-4634d5c67a40088e6f46e56e3c4c3665)
2.分割
split方法和array_split方法都可用于切分数组,split方法只支持平均分组,而array_split方法尽量平均分组。array_split方法的第一个参数是待切分数组。而当第二个参数设置为整数时,按整数指定的份数切分;当第二个参数设置为数组时,将数组中指定索引值作为切分点进行切分。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_68_4.jpg?sign=1739486921-xw6bQvLRTdUMFohW7cmG3A1EUcfx5ubp-0-501f24a6f95feb1e7c9d24f8ce9b03af)
vsplit方法和hsplit方法分别为纵向切分数组和横向切分数组的方法。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_68_5.jpg?sign=1739486921-2cZc8ZQAKebwqmcEzHeY9d7z2GF0R25Y-0-262cf4f40e8b3c68728a700234f6c649)
2.3.4 矩阵与二维数组
矩阵(matrix)是数组的一个分支,即二维数组。在一般情况下,矩阵和数组的使用方法相同,但数组相对更灵活,而矩阵提供了一些二维数组计算的简单方法。在两种方法均可实现功能时,建议使用数组。
矩阵(二维数组)是除一维数组外最常用的数组形式,数据表和图片都会用到该数据结构。本小节除了介绍矩阵的基本操作,还介绍一些线性代数和二维数据表的常用方法。
1.创建矩阵
用np.mat方法可将其他类型的数据转换为矩阵。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_69_1.jpg?sign=1739486921-sFeOfBXXEbieluCrgziiztpFeZfSO0f1-0-60ccbfec39d43ba428f6cb513f065cbe)
使用随机数构造矩阵。在本章前面提到的构造一维数组的方法中大多数都可以用于构造矩阵,如np.ones,np.zeros,np.random.randint等,只要用元组方式指定其形状即可。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_69_2.jpg?sign=1739486921-EmD8gUWtywtsEdosHeZoBq95yyL95kYI-0-ffe9dec12fa2bc41724ccf4be67d2158)
生成对角矩阵:用np.eye方法产生单位矩阵,即对角线元素为1,其他元素为0的矩阵。用diag方法生成对角线元素为给定数组元素(本例中为2,3)的对角矩阵。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_69_3.jpg?sign=1739486921-dHjxn1YABDCNblBG3W5zjqHNH3bfjUTT-0-0996b2f779249a44b0d25abb36a617cc)
2.线性代数常用方法
线性代数包括行列式、矩阵、线性方程组、向量空间等结构,它们均可用Numpy的矩阵描述。Numpy也提供了一些线性变换、特征分解、对角化等问题的求解方法,常用函数如下:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_69_4.jpg?sign=1739486921-qEXMrY04HlblrSvYxwqHUCXxgHJogUbf-0-d52edfe688e7baaf84031696b6125947)
3.数据表常用方法
沿矩阵的某一轴向运算是常用的数据表统计方法,如对某行求和、对某列求均值等,注意要使用axis参数指定轴向。下例使用求和函数(sum)举例统计不同轴向的用法,其他统计方法以此类推。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_70_2.jpg?sign=1739486921-f6KIti68TsjJByMHuHzXr2VQDLiYfuUT-0-d8ef2d170a33c1b706f04cc50e94e5c9)
前面介绍的均值和方差是描述一维数据的统计量,协方差是描述二维数据间相关程度的统计量,如公式(2.4)所示:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_70_3.jpg?sign=1739486921-bJPdmu0CVRTwu3NE4pdXbFljFGdygRo2-0-982459cbc5ecbea8770ef86f93a717b1)
Numpy中使用cov方法计算协方差:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_70_4.jpg?sign=1739486921-v26YlyRt5ZgHg8hup2157AxOfVKMqAbY-0-72da6ba34290756a20b3c8bfb9eaa22f)
2.3.5 其他常用函数
除了各种数学计算,Numpy还提供了一些工具函数,用于数组之间以及数组与其他数据之间的转换。例如,前面提到的np.array方法能将其他类型的数据转换成数组。对应的,在将数组转换成列表时使用tolist方法:
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_70_5.jpg?sign=1739486921-wJophk9eyqxEKo0TRznpy9FADgJMCiOJ-0-445753f95a495f1721a87a4520798cc1)
用view方法以视图的方式创建新数组,它与原数组指向同一数据,且数据保存在base指向的数组中。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_70_6.jpg?sign=1739486921-7Vsxz4ZVvZWQr0GQ4ybRI7At3NZQbVWV-0-a1085430a105c2e5cf5998dd29d3ca50)
用copy方法深度复制生成数据副本,它与原数组指向不同数据。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_70_7.jpg?sign=1739486921-cW1LjetypacXRnhsCBniC2inltAIagdh-0-21b6d9cf42f9f9872d9449ed417175df)