如何更简洁优雅地计算列表中连续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
相关产品推荐
相关产品推荐

