一位朋友突然问我说,numpy中,如何找出一维数组和二维数组(矩阵)中的mode,我当然说我知道怎么找啊,等我回家后再写一下代码就知道了。。。,心里在想,numpy和pandas的常用函数和方法就那些,好像没有直接找出1个mode或多个mode的方法?于是就尝试着先不去stackoverflow找解法,自己动手先写一个自定义函数,看是否能实现这个功能,思路是这样的,先从最简单的数据结构开始,将numpy的一维数组,转成Python list,再使用counter配合循环计算频数,循环2次后再两两比较,然后取出最大值,ok,写好了,亲测有效,请见下图:
可是我这个方法太笨了,而且也不适用于二维数组,甚至要使用嵌套的for循环才能实现对二维数组的操作,太费脑子了,身为宇宙第一语言的Python,一定会有更简洁的方法,stackoverflow搜下,果然有的,嘿嘿,原来用scipy库的stats的这个统计模块,就可实现,代码如下:
另外,我原先写的代码,也可以优化成以下这几行,使用numpy的bincount()搭配argmax()即可,请见下面优化后的代码(此方法不适用于二维数组):
但事实上,还有更为方便的方法,能更快找出mode,那就是将一维数组转成Pandas的Series,将二维数组转成Pandas的DataFrame,然后调用Pandas的mode()方法,一切搞定,就几行代码而已,比如df.mode(),以下为重构后的代码: