在一维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
相关产品推荐
相关产品推荐

