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

如何高效将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:15:08