如何在包含不同长度行的NumPy数组中查找唯一行
为什么
np.unique()会报错? 这个问题我之前也碰到过!你现在用的是object类型的NumPy数组——因为每行长度不一样,NumPy没法用常规的数值数组存储,只能把每行当成对象来存。而np.unique()在处理这类数组时,会默认尝试把所有行转换成统一的形状来做比较,可你的行长度有长有短,自然就会抛出ValueError: shape mismatch的错误——毕竟不同长度的列表没法被广播成同一个形状呀。
解决办法:用Python原生集合去重
NumPy本来就不擅长处理这种变长结构,直接用Python的原生工具反而更简单:
- 列表是不可哈希的,没法直接放进集合里去重,所以先把每行转换成元组(元组是可哈希的)
- 用
set()自动去重 - 最后再把元组转回列表,得到你想要的格式
代码示例
假设你的数组是这样的:
import numpy as np # 你的示例数组 array = np.array( [['item1', 'item2'], ['item1', 'item2'], ['item1', 'item2', 'item3'], ['item1', 'item2', 'item3', 'item4']], dtype=object )
基础去重(不保证顺序)
# 将每行转为元组,用集合去重 unique_tuples = set(tuple(row) for row in array) # 再转回列表的列表 unique_rows = [list(row_tuple) for row_tuple in unique_tuples] print(unique_rows) # 输出:[['item1', 'item2'], ['item1', 'item2', 'item3'], ['item1', 'item2', 'item3', 'item4']]
保留首次出现的顺序(Python 3.7+)
如果你希望去重后的顺序和原数组中唯一行第一次出现的顺序一致,可以用dict.fromkeys(Python 3.7及以上的字典会保留插入顺序):
# 利用字典键的唯一性去重,同时保留顺序 unique_ordered_tuples = list(dict.fromkeys(tuple(row) for row in array)) # 转回列表的列表 unique_rows_ordered = [list(row_tuple) for row_tuple in unique_ordered_tuples] print(unique_rows_ordered) # 输出:[['item1', 'item2'], ['item1', 'item2', 'item3'], ['item1', 'item2', 'item3', 'item4']]
额外建议
其实这种每行长度不一致的结构,用Python原生的list of lists(列表的列表)比NumPy数组更合适哦!NumPy的核心优势是处理同形状的数值型数据,对于这种变长的异构数据,原生列表的操作会更灵活,也不容易踩这种形状不匹配的坑~
内容的提问来源于stack exchange,提问作者yorunome
相关产品推荐
相关产品推荐

