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

如何更简洁优雅地计算列表中连续NaN间隙的长度?

更简洁的连续NaN间隙长度获取方法

针对你需要统计列表中连续np.nan间隙的起始位置和长度的需求,这里提供两种更简洁优雅的实现方式:

方法1:使用itertools.groupby(纯Python实现)

利用itertools.groupby按元素是否为np.nan分组,直接遍历分组统计连续块信息,代码逻辑更紧凑:

from itertools import groupby
import numpy as np

def find_continuous_gaps(data):
    gap_starts = []
    gap_lengths = []
    current_idx = 0
    for is_nan, group in groupby(data, key=lambda x: x is np.nan):
        group_length = len(list(group))
        if is_nan:
            gap_starts.append(current_idx)
            gap_lengths.append(group_length)
        current_idx += group_length
    return gap_starts, gap_lengths

方法2:使用Numpy向量化操作(高效处理大数据)

如果数据量较大,Numpy的向量化操作能大幅提升效率,通过构造NaN掩码一次性定位所有连续块:

import numpy as np

def find_continuous_gaps(data):
    arr = np.array(data)
    nan_mask = np.isnan(arr)
    # 构造前后状态变化的标记数组
    diff_mask = np.diff(np.concatenate(([False], nan_mask, [False])))
    # 获取状态变化的索引位置
    change_indices = np.where(diff_mask)[0]
    # 提取连续NaN块的起始索引和长度
    gap_starts = change_indices[::2].tolist()
    gap_lengths = (change_indices[1::2] - change_indices[::2]).tolist()
    return gap_starts, gap_lengths

测试示例

data = [1, 2, 3, np.nan, np.nan, 6, 7, np.nan, 9, np.nan, np.nan, np.nan, 12]
gap_starts, gap_lengths = find_continuous_gaps(data)
print("Gap starts:", gap_starts)
print("Gap lengths:", gap_lengths)
print("Sum of individual gaps:", sum(gap_lengths))

运行结果与你的原实现一致:

Gap starts: [3, 7, 9]
Gap lengths: [2, 1, 3]
Sum of individual gaps: 6

内容的提问来源于stack exchange,提问作者Ranjan Kumar Sahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:03:15