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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:28:18