NumPy 求众数

众数其实很容易理解,它指的是一组数据中出现最多的那个数。众数,代表了数据的一般水平。需要注意的是,众数并不一定是一个,也可能是多个。怎么来理解呢?

  • 如果有一组数是: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 表示每个众数出现的次数。

上一篇: NumPy 求平均数

下一篇: NumPy 求方差

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号