numpy.unique() 默认返回排序后唯一数组,保持首次出现顺序需用 return_index=true;多维去重支持 axis 参数但不能与 return_counts 同用;性能优于 pandas 但对字符串、nan 处理有差异。

numpy.unique() 是去重的首选,但要注意返回值结构
直接调用 numpy.unique() 就能完成基础去重,但它默认返回排序后的唯一数组,不是原始顺序。如果你需要保持首次出现顺序,得配合 return_index=True 手动索引还原。
- 默认行为:
np.unique([3,1,2,1,3])返回array([1, 2, 3])—— 已升序排列 - 保序去重:
_, idx = np.unique(arr, return_index=True); arr[np.sort(idx)] - 多维数组去重按行/列:加参数
axis=0或axis=1,此时返回的是去重后的子数组,不是标量
二维数组按行去重时,axis=0 不能和 return_counts 混用
这是个容易踩的坑:np.unique(arr_2d, axis=0) 支持,但加上 return_counts=True 会报 ValueError: The axis argument must be None when used with return_counts=True —— NumPy 明确禁止这种组合。
- 想统计每行重复次数?先用
np.unique(arr_2d, axis=0, return_index=True)获取唯一行索引,再用np.apply_along_axis或scipy.stats.mode辅助计数 - 更稳妥的做法:转成 tuple 或 structured array 后再用一维
unique,例如arr.view([('', arr.dtype)] * arr.shape[1]).ravel() -
axis参数只对return_index和return_inverse有效,return_counts必须为None
性能对比:numpy.unique vs pandas.drop_duplicates
纯数值数组且不关心索引时,np.unique() 比 pandas.DataFrame.drop_duplicates() 快 2–5 倍;但一旦涉及字符串、混合类型或需保留原始位置,pandas 更稳。
- 100 万整数去重:
np.unique()约 15ms,pd.Series(arr).drop_duplicates()约 60ms - 含 NaN 的 float 数组:
np.unique()把所有 NaN 当相等处理(符合 IEEE),而 pandas 默认把 NaN 视为不同值,行为不一致 - 如果后续要接 DataFrame 操作,别硬转回 numpy —— 直接用 pandas,避免类型转换开销
去重后想还原原始形状?inverse_index 是关键线索
np.unique(..., return_inverse=True) 返回的 inverse_index 是压缩/还原的桥梁,不是“原始下标”。它表示每个唯一值在原数组中对应的位置索引,常用于量化或编码场景。
- 示例:
u, inv = np.unique([2,1,2,3], return_inverse=True)→u=[1,2,3],inv=[1,0,1,2] - 还原原数组:
u[inv]得到[2,1,2,3],和输入一致 - 注意:
inv长度等于原数组长度,不是唯一值长度;别误当成原始下标直接切片
真正麻烦的是带缺失值、结构化 dtype 或自定义比较逻辑的去重——那些时候 np.unique 就力不从心了,得换方案。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











