You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在一维numpy数组中查找众数并获取首个出现的众数

仅用Numpy获取数组中首个出现的众数

没问题,咱们纯用Numpy就能搞定这个需求——找到数组里频率最高的元素,要是有多个众数,就取最左边那个。下面分两种情况给你实现方案:

通用方案(支持任意可比较元素:整数、浮点数、字符串等)

这个方法不挑数组元素类型,兼容性拉满,核心是先保留元素的首次出现顺序,再统计频率找第一个众数:

import numpy as np

def get_first_mode(arr):
    # 第一步:获取数组中所有唯一元素,以及它们在原数组中首次出现的索引
    unique_vals, first_indices = np.unique(arr, return_index=True)
    # 按首次出现的顺序对唯一元素排序,还原原数组的元素出现顺序
    unique_vals_in_order = unique_vals[np.argsort(first_indices)]
    
    # 第二步:统计每个唯一元素在原数组中的出现次数
    counts = np.array([np.sum(arr == val) for val in unique_vals_in_order])
    
    # 第三步:找到最高频率,再取第一个达到该频率的元素
    max_frequency = counts.max()
    return unique_vals_in_order[counts == max_frequency][0]

# 测试示例
test_arr = np.array([1,2,2,3,3,4])
print(get_first_mode(test_arr))  # 输出:2

原理说明

  • np.unique(..., return_index=True)会返回去重后的元素,以及每个元素在原数组中第一次出现的索引;
  • 通过np.argsort(first_indices)对索引排序,就能把去重元素还原成原数组中的出现顺序;
  • 最后筛选出频率最高的元素,取第一个即可。

高效方案(仅适用于非负整数数组)

如果你的数组全是非负整数,用np.bincount会更快,因为它专门用来统计非负整数的出现次数:

import numpy as np

def get_first_mode_non_neg_int(arr):
    # 统计每个非负整数的出现次数,索引对应元素的值
    counts = np.bincount(arr)
    # 找到最高频率,再取第一个达到该频率的元素(也就是对应的索引)
    max_frequency = counts.max()
    return np.argmax(counts == max_frequency)

# 测试示例
test_arr = np.array([1,2,2,3,3,4])
print(get_first_mode_non_neg_int(test_arr))  # 输出:2

原理说明

  • np.bincount(arr)会生成一个数组,索引i对应的数值就是原数组中i出现的次数;
  • counts == max_frequency会生成布尔数组,np.argmax会返回第一个True的索引,也就是我们要找的首个众数。

内容的提问来源于stack exchange,提问作者whitebear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:37:32