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

如何快速移除列表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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:22:54