如何找出numpy数组中出现次数最多的标签?附函数实现需求
如何找出NumPy数组中出现次数最多的标签(含平局处理)
嘿,我之前处理分类标签的时候刚好碰到过这个问题——平局时返回最先出现的值确实是个常见需求。下面给你两种靠谱的实现方式,都能完美满足你的要求:
方法一:纯NumPy原生实现(高效处理大数组)
这种方法完全基于NumPy的原生函数,性能拉满,特别适合处理大规模的数组:
import numpy as np def most_frequent_label(arr): # 一次性获取唯一元素、出现次数、第一次出现的索引 unique_vals, counts, first_indices = np.unique( arr, return_counts=True, return_index=True ) # 找到最高出现次数 max_count = np.max(counts) # 筛选出所有达到最高次数的候选元素及其首次索引 mask = counts == max_count candidates = unique_vals[mask] candidate_indices = first_indices[mask] # 返回首次出现最早的候选元素 return candidates[np.argmin(candidate_indices)]
核心逻辑:
- 用
np.unique()同时拿到三个关键信息:数组中的唯一元素、每个元素的出现频次、每个元素第一次出现在原数组中的位置索引 - 先定位到最高的频次值,再筛选出所有频次等于该值的候选元素
- 最后通过比较候选元素的首次出现索引,返回索引最小(也就是最先出现)的那个值
测试案例:
# 测试1:单一最高频元素 test_arr1 = np.array([2, 3, 2, 1, 2]) print(most_frequent_label(test_arr1)) # 输出: 2 # 测试2:平局场景,返回最先出现的元素 test_arr2 = np.array([3, 1, 3, 1, 2]) print(most_frequent_label(test_arr2)) # 输出: 3(3和1都出现2次,但3先出现)
方法二:结合Python标准库实现(直观易懂)
如果你更习惯用Python标准库,这种方法逻辑更直白,容易理解:
from collections import Counter import numpy as np def most_frequent_label(arr): # 统计每个元素的出现次数 count_counter = Counter(arr.tolist()) # 获取最高出现次数 max_count = max(count_counter.values()) # 遍历原数组,第一个出现次数等于max_count的元素就是答案 for val in arr: if count_counter[val] == max_count: return val
核心逻辑:
- 用
Counter快速统计所有元素的出现频次 - 遍历原数组的每一个元素,遇到第一个频次等于最高值的元素直接返回(因为是按原数组顺序遍历,所以第一个符合条件的就是最先出现的平局值)
测试案例:
用和方法一相同的测试数组,得到的结果完全一致。
两种方法各有优势:纯NumPy的方案在处理超大数组时性能更优,而标准库方案逻辑更简单,适合快速实现和调试。你可以根据自己的使用场景选择~
内容的提问来源于stack exchange,提问作者user11807203
相关产品推荐
相关产品推荐

