18

手把手教你学Numpy,这些api不容错过

 4 years ago
source link: http://www.cnblogs.com/techflow/p/13124138.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

今天是 Numpy专题 的第5篇文章,我们来继续学习Numpy当中一些常用的数学和统计函数。

基本统计方法

在日常的工作当中,我们经常需要通过一系列值来了解特征的分布情况。比较常用的有 均值、方差、标准差、百分位数 等等。前面几个都比较好理解,简单介绍一下这个百分位数,它是指将元素从小到大排列之后,排在第x%位上的值。我们一般常用的是25%,50%和75%这三个值,通过这几个值,我们很容易对于整个特征的分布有一个大概的了解。

前面三个指标:均值、方差、标准差都很好理解,我们直接看代码就行。

7B7Zzae.jpg!web

median和percentile分别是求中位数与百分位数,它们不是Numpy当中array的函数,而是numpy的库函数。所以我们需要把array当做参数传入。percentile这个函数还需要额外传入一个int,表示我们想要得到的百分位数,比如我们想要知道50%位置上的数,则输入50。

iAFvEnQ.jpg!web

除了这些之外,我们还会经常用到sum,min,max,argmin,argmax这几个函数。sum,min,max很好理解,argmin和argmax的意思是 获取最小值和最大值的索引

jYrEZzV.jpg!web

这里返回的索引有点奇怪,和我们想的不同,居然不是一个二维的索引而是一维的。实际上numpy的内部 会将高维数组转化成一维之后再进行这个操作 ,我们可以reshape一下数组来进行验证:

yIfuIv6.jpg!web

这些只是api的基本用法,numpy当中支持的功能不仅如此。我们观察一下这些函数会发现,它们的作用域都是一组数据,返回的是一组数据通过某种运算得到的结果。举个例子,比如sum,是对一组数据的价格。std计算的是一组数据的标准差,这样的函数我们称为 聚合函数

numpy当中的聚合函数在使用的时候允许传入轴这个参数, 限制它聚合的范围 。我们通过axis这个参数来控制,axis=0表示对列聚合,axis=1表示对行聚合。我们死记的话总是会搞混淆,实际上axis传入的也是一个索引,表示第几个索引的索引。我们的二维数组的shape是[行, 列],其中的第0位是行,第1位是列,可以认为axis是这个索引向量的一个索引。

我们可以来验证一下:

2uUjMjv.jpg!web

可以看到axis=0和axis=1返回的向量的长度是不同的,因为 以列为单位聚合只有4列 ,所以得到的是一个1 x 4的结果。而 以行为单位聚合有5行 ,所以是一个1 x 5的向量。

除了上面介绍的这些函数之外,还有cumsum和cumprod这两个api。其中cumsum是用来对数组进行累加运算,而cumprod是进行的累乘运算。只是在实际工作当中,很少用到,我就不展开细讲了,感兴趣的同学可以查阅api文档了解一下。

bool数组的方法

我们之前在Python的入门文章当中曾经提到过,在Python中 True和False完全等价于1和0 。那么在上面这些计算的方法当中,如果存在bool类型的值,都会被转化成1和0进行的计算。

我们灵活运用这点会非常方便,举个例子,假设我们要统计一批数据当中有多少条大于0。我们利用sum会非常方便:

yaeuQrE.jpg!web

bool数组除了可以应用上面这些基本的运算api之外,还有专门的两个api,也非常方便。一个叫做 any ,一个叫做 all 。any的意思是只要数组当中有一个是True,那么结果就是True。可以认为是Is there any True in the array的意思,同样,all就是说只有数组当中都是True,结果才是True。对应的英文自然是Are the values in the array all True。

这个只要理解了,基本上很难忘记。

UjeA3i7.jpg!web

排序

Python原生的数组可以排序,numpy当中的数组自然也不例外。我们只需要调用sort方法就可以排序了,不过有一点需要注意,numpy中的sort默认是一个 inplace的方法 。也就是说我们调用完了sort之后,原数组的值就自动变化了。

N7vaI3z.jpg!web

如果写成了arr = arr.sort()会得到一个None,千万要注意。

UbiAjeF.jpg!web

同样,我们也可以通过传入轴这个参数来控制它的排序范围,可以做到 对每一列排序或者是对每一行排序 ,我们来看个例子:

rmqURji.jpg!web

这个是对列排序,如果传入0则是对行排序,这个应该不难理解。

集合api

numpy当中还提供了一些面向集合的api,相比于针对各种计算的api,这些方法用到的情况比较少。常用的一般只有 unique和in1d

unique顾名思义就是去重的api,可以返回一维array去重且排序之后的结果。我们来看个例子:

jyu6jiu.jpg!web

它等价于:

set(sorted(arr))

in1d是用来判断集合内的元素是否在另外一个集合当中,函数会返回一个bool型的数组。我们也可以来看个例子:

3EzAFjE.jpg!web

除了这两个api之外,还有像是计算并集并排序的union1d,计算差集的setdiff1d,计算两个集合交集并排序的intersect1d等等。这些api的使用频率实在是不高,所以就不赘述了。用到的时候再去查阅即可。

总结

今天我们聊了numpy当中很多常用的计算api,这些api在我们日常做 机器学习和数据分析的时候经常用到 。比如分析特征分布的时候,如果数据量很大是不适合作图或者是可视化观察的。这个时候可以从中位数、均值、方差和几个关键百分位点入手,再比如在我们使用softmax多分类的时候,也会用到argmax来获取分类的结果。

总之,今天的内容非常关键,在numpy整体的应用当中占比很高,希望大家都能熟悉它们的基本用法。这样即使以后忘记,用到的时候再查阅也还来得及。

今天的文章就是这些,如果喜欢本文,可以的话请 点个关注 ,给我一点鼓励,也方便获取更多文章。

本文使用 mdnice 排版


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK