所谓众数(mode)就是数列中出现次数最多的数,比如在[0, 1, 1, 3, 1, 7, 2, 4]中, 1出现了3次,其他的数出现次数均小于3次,因此1是众数。
如何用Python求某个数列的众数呢?首先想到用numpy直接求。
很遗憾,Numpy中没有直接诸如np.mean()求均值,np.median()求中位数等可以直接求众数的方法,但可以用np.bincount()函数和np.argmax()共同实现,过程也很简单。
1.np.bincount()函数
简单解释下该函数的功能,还是以[0, 1, 1, 3, 1, 7, 2, 4]为例:
(1)np.bincount()函数首先会找出数组[0, 1, 1, 3, 1, 7, 2, 4]中的最大值,很明显是7,它会统计0,1,2,3,4,5,6,7这8个数在[0, 1, 1, 3, 1, 7, 2, 4]中出现的次数然后以数组形式返回,这个返回数组的索引(index)刚好就是0-7这8个数,而索引对应的值(value) 正是该索引出现的次数,详细来说就是0出现1次,1出现3次,2出现1次,3出现1次,4出现1次,5出现0次,6出现0次,7出现1次,如下表所示:
import numpy as np
nums = [0,1,1,3,1,7,2,4]
countList = np.bincount(np.array(nums))
print(countList)
结果和我们自己手动统计的是一样的
array([1, 3, 1, 1, 1, 0, 0, 1], dtype=int64)
(2)那如何取出众数1了?很简单,1不就是数组[1, 3, 1, 1, 1, 0, 0, 1]中最大值3对应索引吗?
np.argmax(nums)函数刚好可以返回数组nums中最大值的索引。
mode = np.argmax(countList)
print(f'数组{nums}的众数为:{mode},出现了{np.max(countList)}次')
数组[0, 1, 1, 3, 1, 7, 2, 4]的众数为:1,出现了3次