3D NumPy数组时间维度中心化移动均值计算NaN问题排查
代码错误排查与修正
核心错误点
- 循环维度完全搞反:原数组形状为
(时间维度8035, 纬度43, 经度43),你需要对每个(纬度j, 经度k)组合,提取对应的时间序列b[:, j, k]来计算移动平均,但原代码先遍历时间维度i,再取b[i][j][k]——这只是单个时间点的单个经纬度数值,不是时间序列,输入到移动平均函数后自然全是NaN。 - 结果数组初始化错误:你初始化了长度为31390的一维数组
mat,但目标结果应该和原数组同形状(8035,43,43),31390这个数值完全不符合需求(43*43=1849,每个经纬度点对应8035个时间值)。 - 循环内赋值逻辑错误:原代码在
k循环里反复覆盖a,最后只把最后一个k对应的结果赋值给mat[cont],且mat是一维数组,无法存储每个经纬度点的8035个时间值,必然导致数据丢失和形状不匹配。
修正后的代码
import numpy as np import pandas as pd def moving_average_centered(a, n): return pd.Series(a).rolling(window=n, center=True).mean().to_numpy() # 假设b是你的原始(8035,43,43)数组,替换成你的真实数据 b = np.random.rand(8035, 43, 43) # 初始化和原数组同形状的结果数组 mat = np.zeros_like(b) # 遍历纬度、经度,对每个经纬度点的时间序列计算移动平均 for j in range(b.shape[1]): # 纬度维度(索引1) for k in range(b.shape[2]): # 经度维度(索引2) # 提取当前经纬度点的完整时间序列 time_series = b[:, j, k] # 计算中心化移动平均并赋值到结果数组对应位置 mat[:, j, k] = moving_average_centered(time_series, 11) # 验证结果形状,应为(8035,43,43) print(mat.shape)
关于NaN的说明
使用center=True且窗口大小为11时,时间序列的前5个和后5个值会是NaN——这是中心化移动平均的正常现象(无法取到足够的前后数据计算均值)。如果原始数组没有NaN,中间的数值应该是有效均值;若仍然全是NaN,请检查原始数组b是否本身包含大量NaN值。
内容的提问来源于stack exchange,提问作者Maria Cecília
相关产品推荐
相关产品推荐

