基于Numpy数组值(同索引)筛选列表条目优化方案咨询
优化方案:更简洁高效的分组实现
你的需求其实可以通过更简洁的方式实现,同时还能避免原代码里的潜在问题(比如原代码计算number_of_validResults的方式其实是错误的,np.unique(resultData>=0)得到的是布尔值的唯一值,长度永远是2,和你示例里的13完全不符)。下面提供两种优化思路,按需选择:
方案一:纯Python简洁写法(易读性优先)
利用zip配对数据,结合collections.defaultdict自动分组,代码更直观,不需要手动维护索引:
from collections import defaultdict # 第一步:筛选有效数据(排除resultData中<0的条目)并配对 valid_pairs = [(res_val, data_item) for res_val, data_item in zip(resultData, baseDataList) if res_val >= 0] # 第二步:按resultData的有效值分组 result_dict = defaultdict(list) for res_val, data_item in valid_pairs: result_dict[res_val].append(data_item) # 如果需要和原输出一样的列表格式(按结果值排序) resultList = [result_dict[key] for key in sorted(result_dict.keys())]
优点:
- 不需要手动维护
idx变量,彻底避免索引错误 - 自动处理所有唯一结果值,不需要提前计算数量
- 代码逻辑清晰,可读性强,冗余变量少
方案二:Numpy向量化写法(性能优先,适合大数据量)
如果你的数据量很大,用Numpy的向量化操作会比纯Python循环高效得多:
import numpy as np # 生成有效数据的掩码 valid_mask = resultData >= 0 # 筛选出有效的结果值和对应的base数据 valid_results = resultData[valid_mask] valid_base = np.array(baseDataList)[valid_mask] # 若baseDataList是元组列表,转成numpy数组不影响后续操作 # 获取排序后的唯一结果值 unique_res = np.sort(np.unique(valid_results)) # 分组生成结果列表 resultList = [valid_base[valid_results == res].tolist() for res in unique_res]
优点:
- 利用Numpy的向量化运算,比Python循环快数倍(数据量越大优势越明显)
- 代码同样简洁,避免手动索引操作
原代码的问题说明
你原来的代码里number_of_validResults = len(np.unique(resultData>=0))是错误的:resultData>=0返回的是布尔数组,np.unique后只会得到[False, True],长度永远是2,这和你示例里的13个唯一值完全不符,会导致resultList的长度错误,后续分组也会出问题。上面的优化方案都避免了这个错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

