众数其实很容易理解,它指的是一组数据中出现最多的那个数。众数,代表了数据的一般水平。需要注意的是,众数并不一定是一个,也可能是多个。怎么来理解呢?
- 如果有一组数是:10、20、30、40、10,那么这一组数只有一个众数,那就是:10。
- 如果有一组数是:10、20、30、40、20、10,那么这一组数有 2 个众数,那就是:10、20。
对于众数来说,它具有以下性质:
- 众数可以用于描述分类数据。
- 一组数据可能存在多个众数。
- 众数对极端值不敏感,适合偏态分布。
在 NumPy 中,并没有提供直接的函数来计算数组的众数。不过我们可以使用 “曲线救国” 的方式来实现。
numpy.bincount() + numpy.argmax() 求众数
在 NumPy 中,我们可以先使用 bincount() 函数来统计数组中每个值出现的次数,然后再使用 argmax() 函数来找到出现次数最多的值,这样这个值就是 “众数” 。
语法:
np.bincount(arr)说明:
bincount() 函数的参数是一个一维数组。它会返回一个数组,其中每个元素表示原数组中对应索引值出现的次数。
不过 numpy.bincount() + numpy.argmax() 这种方式也存在一定的限制,比如:
- 只适用于数组元素都是非负整数的情况。
- 无法处理多众数的场景。
- 输入的数组必须是一维数组。
示例 1:bincount() + argmax() 求众数
import numpy as np
arr = np.array([5, 3, 7, 3, 8, 9, 2, 9, 5, 8, 5])
counts = np.bincount(arr)
mode = np.argmax(counts)
print(counts)
print(mode)运行结果如下。
[0 0 1 2 0 3 0 1 2 2]
5分析:
np.bincount(arr) 返回数组中每个整数值出现的次数。注意,np.bincount(arr) 会统计数组中从 0 到最大值(max(arr))之间每个整数的出现次数。
- 0 出现了 0 次(索引 0)。
- 1 出现了 0 次(索引 1)。
- 2 出现了 1 次(索引 2)。
- 3 出现了 2 次(索引 3)。
- 4 出现了 0 次(索引 4)。
- 5 出现了 3 次(索引 5)。
- 6 出现了 0 次(索引 6)。
- 7 出现了 1 次(索引 7)。
- 8 出现了 2 次(索引 8)。
- 9 出现了 2 次(索引 9)。
在 counts 数组中,最大值是 3,其索引是 5。因此 np.argmax(counts) 返回 5,这正是数组中的众数。
scipy.stats.mode() 求众数
在 SciPy 的 stats 模块中,我们可以使用 mode() 函数来计算数组的众数。mode() 函数功能非常强大,不仅支持多维数组和多种数据类型,还能返回 “众数” 及其 “出现次数”。
在使用之前,我们需要确保先安装了 SciPy,执行以下命令即可:
pip install scipy语法:
scipy.stats.mode(arr, axis=0, keepdims=False)说明:
scipy.stats.mode() 函数接收以下参数。
arr(必选):需要计算众数的数组。axis(可选,默认:0):表示指定沿哪个轴计算众数。对于二维数组来说:axis=0:表示在每一列中查找众数(沿着行的方向),返回一个包含每列的众数和计数。axis=1:表示在每一行中查找众数(沿着列的方向),返回一个包含每行的众数和计数。
keepdims(可选,默认:False):是否保留原数组的维度。True:表示在结果中,众数所在的轴会保留,但长度变为 1。False:表示会压缩该轴,结果会减少一个维度。
mode() 函数会返回一个 ModeResult 对象,它包含以下 2 个属性:
mode: 众数的值。count: 每个众数出现的次数。
示例 2:scipy.stats.mode() 求众数
import numpy as np
from scipy import stats
arr = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
result = stats.mode(arr) # 计算众数
print('完整结果:', result)
print('众数值:', result.mode)
print('出现次数:', result.count)运行结果如下。
完整结果:ModeResult(mode=np.int64(4), count=np.int64(4))
众数值:4
出现次数:4分析:
stats.mode(arr) 用于计算数组 arr 的众数,其结果是一个 ModeResult 对象,包含两个属性:mode 表示众数值,count 表示每个众数出现的次数。
