如何从包含不同长度子数组的numpy数组中提取唯一元素
解决方案
报错原因
np.unique默认会尝试对数组元素进行广播比较,长度不同的numpy数组无法执行广播操作,因此直接调用会抛出形状不匹配的错误。
方案1:纯Python实现(无额外依赖)
核心思路是将不可哈希的numpy数组转为可哈希的元组,通过集合记录已出现的元素实现去重:
# 第一步:提取所有子数组(适配你给出的main_arr结构:每个元素是[子数组]) sub_arrays = [item[0] for item in main_arr] seen = set() unique_subarrays = [] for arr in sub_arrays: arr_tuple = tuple(arr) if arr_tuple not in seen: seen.add(arr_tuple) unique_subarrays.append(arr) # 如果需要恢复为和原main_arr相同的嵌套结构,执行以下代码 import numpy as np unique_main_arr = np.array([[arr] for arr in unique_subarrays], dtype=object)
方案2:高性能实现(适合子数组长度较大的场景)
如果子数组元素很多,转元组的性能开销较高,可以通过数组的形状+字节内容作为去重标识,速度提升非常明显:
sub_arrays = [item[0] for item in main_arr] seen = set() unique_subarrays = [] for arr in sub_arrays: # 同时记录形状和字节内容,避免不同形状但字节内容巧合一致的误判 unique_key = (arr.shape, arr.tobytes()) if unique_key not in seen: seen.add(unique_key) unique_subarrays.append(arr)
可选:浮点数精度适配
如果存在浮点数精度误差需要忽略(比如3.1415926和3.1415927判定为相同),可以先对数组做精度截断再生成标识:
# 示例保留4位小数,可按需调整decimals参数 unique_key = (arr.shape, np.round(arr, decimals=4).tobytes())
内容的提问来源于stack exchange,提问作者NeStack
相关产品推荐
相关产品推荐

