np.unique(arr, return_counts=true)可一次性返回去重数组及对应频次,最快最简;需注意axis、nan、浮点精度、dtype及避免重复调用。

用 np.unique 一次性拿到值和频次,别手写循环
直接调 np.unique 并设 return_counts=True,就能同时返回去重后的数组和对应频次——这是最简、最快、最 NumPy 的做法。它底层用 C 实现,比 Python 循环或 collections.Counter 快一个数量级以上,尤其对百万级数组。
常见错误是只传入数组却忘了加参数,结果只拿到唯一值,频次还得自己统计;或者误以为要先排序再计数(np.unique 默认已排序,无需额外操作)。
-
np.unique(arr, return_counts=True)返回两个数组:values和counts,顺序严格一一对应 - 若需保持原始出现顺序(非升序),不能直接用此函数,得换
np.unique+np.argsort组合,或改用pandas.Series.value_counts - 对浮点数组,注意精度问题:默认不合并“视觉相等但二进制不同”的数(如
0.1 + 0.2vs0.3),必要时先用np.round或np.around统一精度
处理多维数组时,必须显式指定 axis
默认 np.unique 会把多维数组展平成一维再计算,这往往不是你想要的。比如想按行查唯一行,就得加 axis=0;按列查就用 axis=1。漏掉这个参数,结果完全对不上。
注意:return_counts=True 在指定 axis 时仍有效,但返回的 counts 是一维数组,长度等于唯一子数组个数,不是原形状。
-
np.unique(arr_2d, axis=0, return_counts=True)→ 返回每种“行”及其出现次数 -
axis不支持负数索引(如axis=-1),必须用正整数 - 指定
axis后,return_index和return_inverse依然可用,但含义变为沿该轴的索引位置
需要保留原始索引位置?用 return_index=True 配合 argsort
有时不光要知道频次,还想定位第一次出现的位置(比如做数据清洗时标记重复样本的首例)。这时加 return_index=True,返回的索引是原始扁平化后的一维索引——对多维数组,得用 np.unravel_index 转回坐标。
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
另一个典型场景是:按频次降序排列结果。np.unique 本身不提供排序选项,得靠 np.argsort(counts)[::-1] 手动重排 values 和 counts。
-
idx = np.argsort(counts)[::-1]→ 获取频次从高到低的索引 -
values[idx]和counts[idx]就是按频次排序的结果 - 若数组含 NaN,
np.unique默认把所有 NaN 当作相等处理(合并为一个),但np.nan本身无法参与大小比较,所以argsort前建议用np.nan_to_num或掩码过滤
性能敏感场景下,避免重复调用 np.unique
有人为了分别取值和频次,写两遍 np.unique(一次不带 return_counts,一次带),这是典型浪费:两次都做了完整去重扫描。只要一次调用,解包即可。
更隐蔽的坑是嵌套使用:比如在循环里反复对小数组调 np.unique。此时应考虑是否能批量预处理,或改用布尔索引 + np.sum 等向量化替代(例如只查某几个特定值的频次,用 (arr == x).sum() 比 np.unique 更快)。
- 单次调用:
vals, counts = np.unique(arr, return_counts=True) - 查单个值频次更快:
(arr == target).sum()(尤其 target 数量少时) - 超大数组且内存受限?用
np.bincount(仅限非负整数,且比np.unique内存更省、速度更快)
真正要注意的是:返回的 counts 类型默认是 int64,但如果原数组是 uint8 且元素范围很小,频次可能被截断——检查 counts.dtype 是否合理,必要时显式转成 np.int64。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










