如何快速移除列表Ave中各子数组的NaN值?现有代码运行缓慢
优化方案:快速移除列表中子数组的NaN值
我来帮你优化这段代码!你的原代码运行慢主要有两个原因:一是嵌套了多层循环(外层遍历Ave、中间重复8次的while循环、内层遍历子数组元素),二是频繁使用del操作——在列表里删除元素是线性时间复杂度,每次删除都要移动后续元素,数据量越大越慢。
用numpy的向量化操作可以彻底解决这个问题,效率会提升很多。直接看优化后的代码:
import numpy as np # 假设你的Ave列表结构如下 Ave = [ np.array([np.nan]), np.array([0.03030303]), np.array([0.025]), np.array([0.03546099]), np.array([0.02877698]), np.array([0.05343511]), np.array([np.nan]), np.array([np.nan]) ] # 核心优化:列表推导式 + numpy布尔索引过滤NaN Ave_cleaned = [sub_arr[~np.isnan(sub_arr)] for sub_arr in Ave]
为什么这个方案更快?
- numpy向量化操作:
np.isnan(sub_arr)会一次性生成一个和子数组长度相同的布尔数组,标记哪些元素是NaN;~取反后就能拿到所有非NaN元素的索引,直接通过索引提取元素——这部分是numpy内部用C实现的,比纯Python循环快几个数量级。 - 简洁高效的列表推导式:替代了多层嵌套的for-while循环,语法更简洁,执行效率也更高。
结果说明
- 对于原本全是NaN的子数组(比如你的Ave[0]、Ave[6]、Ave[7]),过滤后会得到空的numpy数组,和你原代码的处理结果一致。
- 如果需要过滤掉空数组,可以在列表推导式里加个判断:
Ave_cleaned = [sub_arr[~np.isnan(sub_arr)] for sub_arr in Ave if len(sub_arr[~np.isnan(sub_arr)]) > 0]
内容的提问来源于stack exchange,提问作者user8787011
相关产品推荐
相关产品推荐

