如何高效将N×D格式时间序列数据集转换为(N-T+1)×T×D格式?
高性能时间序列滑动窗口转换方案
核心实现思路
针对你需要将N行D列二维时间序列转换为N2×T×D三维滑动窗口格式的需求,最优化的方案是直接利用数组内存步长构造视图,完全不需要复制数据,也没有循环拼接开销,性能比你现有实现提升万倍级,且兼容Windows、Linux双系统。
具体实现代码
1. Numpy版本(和你原有实现输出完全兼容)
用numpy.lib.stride_tricks.as_strided构造零拷贝视图:
import numpy as np def TemporalTransformation_strided(ds, T): N, D = ds.shape N2 = N - T + 1 # 读取原数组的内存步长 stride_row, stride_col = ds.strides # 直接构造三维视图,无任何数据复制 return np.lib.stride_tricks.as_strided( ds, shape=(N2, T, D), strides=(stride_row, stride_row, stride_col) )
正确性验证:
你可以用原有测试代码替换转换函数,输出结果和你现有实现完全一致,且不管T取700还是更大值、数据集有多少行,转换都是瞬间完成,内存占用几乎没有额外增长。
2. PyTorch版本(性能和numpy版相当,无需自定义Dataset)
PyTorch原生支持步长视图构造,彻底解决自定义Dataset+DataLoader的性能问题:
import torch def TemporalTransformation_torch(ds, T): N, D = ds.shape N2 = N - T + 1 stride_row, stride_col = ds.stride() return torch.as_strided( ds, size=(N2, T, D), stride=(stride_row, stride_row, stride_col) )
该方案直接生成PyTorch张量视图,不需要额外做numpy到张量的转换,训练时的吞吐速度和你原有numpy预转换方案完全一致。
注意事项
- 上述两种方案生成的都是原数据的只读视图,如果你需要修改生成的三维数组且不影响原数组,只需要在返回结果后调用
.copy()(numpy)或.clone()(PyTorch)即可;训练场景下仅读取数据不需要修改的话,可以不用拷贝,最大化内存效率。 - 所有用到的API都是numpy和PyTorch官方内置能力,跨Windows、Linux平台无兼容问题。
内容的提问来源于stack exchange,提问作者N1h1l1sT
相关产品推荐
相关产品推荐

