You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在包含不同长度行的NumPy数组中查找唯一行

为什么np.unique()会报错?

这个问题我之前也碰到过!你现在用的是object类型的NumPy数组——因为每行长度不一样,NumPy没法用常规的数值数组存储,只能把每行当成对象来存。而np.unique()在处理这类数组时,会默认尝试把所有行转换成统一的形状来做比较,可你的行长度有长有短,自然就会抛出ValueError: shape mismatch的错误——毕竟不同长度的列表没法被广播成同一个形状呀。

解决办法:用Python原生集合去重

NumPy本来就不擅长处理这种变长结构,直接用Python的原生工具反而更简单:

  1. 列表是不可哈希的,没法直接放进集合里去重,所以先把每行转换成元组(元组是可哈希的)
  2. 用set()自动去重
  3. 最后再把元组转回列表,得到你想要的格式

代码示例

假设你的数组是这样的:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:27:30