如何将网格气象数据转换为ConvLSTM2D要求的5维输入数组
气象网格数据转换为ConvLSTM2D输入格式的实现方法
场景1:已得到形状为(num_hours, lat, lon, num_features)的4维数组
直接使用numpy滑动窗口接口生成重叠24小时序列,无额外内存复制,效率极高:
import numpy as np seq_len = 24 # 序列长度设置为24小时 # 生成滑动窗口视图,输出形状为 (num_hours-seq_len+1, lat, lon, num_features, seq_len) data_5d = np.lib.stride_tricks.sliding_window_view(data_4d, window_shape=seq_len, axis=0) # 调整维度顺序到要求的 (样本数, 序列长度, lat, lon, 特征数) data_5d = np.moveaxis(data_5d, source=-1, destination=1)
- 生成的样本总数为
num_hours - 24 + 1,符合重叠滑动窗口的规则 - 若需要非重叠序列,可在生成视图后通过步长切片
data_5d = data_5d[::seq_len]实现
场景2:直接从长表格式Pandas DataFrame转换
无需先生成4维数组,可通过透视+维度重整一步到位,比循环拼接效率高10倍以上:
import pandas as pd import numpy as np seq_len = 24 # 1. 透视表转换,把特征类型从行转成列 df_pivot = df.pivot( index=['ts', 'lat', 'lon'], columns='weather_variable', values='value' ).reset_index() # 2. 按时间、纬度、经度严格排序,保证网格坐标顺序正确 df_pivot = df_pivot.sort_values(by=['ts', 'lat', 'lon']).reset_index(drop=True) # 3. 统计各维度长度 num_hours = df_pivot['ts'].nunique() num_lat = df_pivot['lat'].nunique() num_lon = df_pivot['lon'].nunique() num_feats = df['weather_variable'].nunique() # 4. 特征列直接reshape为4维数组 data_4d = df_pivot.iloc[:, 3:].values.reshape(num_hours, num_lat, num_lon, num_feats) # 5. 生成5维序列,同场景1逻辑 data_5d = np.lib.stride_tricks.sliding_window_view(data_4d, seq_len, axis=0) data_5d = np.moveaxis(data_5d, -1, 1)
结果验证
针对你提供的模拟数据集,最终输出data_5d的形状为(6481, 24, 20, 20, 3),和你的预期完全一致。
注意:如果原始数据存在缺失的时间步,需先做时间序列补全/插值,避免生成的序列出现时间断层。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

