NumPy数组如何提取唯一值并按元素出现频次降序排序
NumPy数组按频次降序提取唯一值实现方案
你可以通过以下两种主流方式实现需求,核心逻辑都是先统计每个元素的出现次数,再按次数对唯一值做降序排序。
方案1:纯NumPy原生实现(大数组性能最优)
全程使用NumPy内置接口完成,无额外依赖,处理百万级以上大数组时效率更高:
import numpy as np # 目标数组 arr = np.array([5,6,7,6,1,9,10,3,1,6]) # 同时获取数组所有唯一值、以及每个唯一值对应的出现次数 unique_vals, counts = np.unique(arr, return_counts=True) # 按出现次数做降序排序,拿到排序后的索引 sorted_index = np.argsort(-counts) # 按排序索引取出对应唯一值即为最终结果 result = unique_vals[sorted_index]
运行后result的核心排序符合需求:出现3次的6排在首位,出现2次的1排在次位,剩余出现1次的元素排在后面。
注:
np.unique默认返回的唯一值按元素值升序排列,因此同频次元素默认按值从小到大排序。如果需要调整同频次元素的排序规则(比如按原数组首次出现位置、按元素值降序排列),只需要修改np.argsort的排序键即可。
方案2:标准库Counter实现(写法最简洁)
用Python标准库collections.Counter完成统计和排序,代码更短更易读:
import numpy as np from collections import Counter arr = np.array([5,6,7,6,1,9,10,3,1,6]) # most_common()会直接按频次降序返回(元素, 计数)的元组列表 sorted_pairs = Counter(arr.tolist()).most_common() # 提取元素转成NumPy数组即可 result = np.array([item[0] for item in sorted_pairs])
在Python 3.7及以上版本中,Counter会保留元素的首次插入顺序,因此同频次元素会按照其在原数组中第一次出现的顺序排列。
内容的提问来源于stack exchange,提问作者BGR
相关产品推荐
相关产品推荐

