如何用Numpy构建用于神经网络的时序预测输入数组?
问题描述
现有一个形状为(1542, 2)的2D NumPy数组:
[[-0.83776179 -1. ] [-0.83229744 -0.99845917] [-0.81120124 -0.99691834] ... [ 0.33190834 0.99691834] [ 0.3312287 0.99845917] [ 0.34686055 1. ]]
需要将其分组,每个样本包含目标条目之前的200个条目,用于预测下一个条目,最终得到形状为(N, 200, 2)的3D数组(其中N = 1542 - 200,即总样本数),结构示例如下:
[[[-0.83776179 -1. ] [-0.83229744 -0.99845917] [-0.81120124 -0.99691834] ... # 共200个元素 [ 0.33190834 0.99691834] [ 0.3312287 0.99845917] [ 0.34686055 1. ]] # 后续样本依次滑动窗口生成 [[-0.83229744 -0.99845917] [-0.81120124 -0.99691834] ... # 同样200个元素 [ 0.3312287 0.99845917] [ 0.34686055 1. ] # 下一个新条目 [x, y]]]
最优实现方法
使用NumPy的np.lib.stride_tricks.sliding_window_view是最高效的方案,它通过调整数组的内存步长实现滑动窗口,不需要额外复制数据,性能最优。
代码示例
假设原始数组名为arr:
import numpy as np # 原始数组,形状(1542, 2) arr = np.array([[-0.83776179, -1. ], [-0.83229744, -0.99845917], [-0.81120124, -0.99691834], # ... 省略其余元素 [ 0.33190834, 0.99691834], [ 0.3312287, 0.99845917], [ 0.34686055, 1. ]]) # 生成滑动窗口,每个窗口包含200个连续条目 windowed_arr = np.lib.stride_tricks.sliding_window_view(arr, window_shape=(200, 2)) # 调整形状到(N, 200, 2),其中N=1542-200=1342 windowed_arr = windowed_arr.squeeze(axis=1)
补充说明
sliding_window_view会生成形状为(1342, 1, 200, 2)的数组,通过squeeze(axis=1)去掉多余的维度,得到最终的(1342, 200, 2)结构。- 这种方法完全基于内存视图,没有数据复制,处理大数组时速度远快于循环或列表推导式。
- 如果你的NumPy版本低于1.20.0(
sliding_window_view在1.20.0版本引入),可以用np.lib.stride_tricks.as_strided手动实现,代码如下:
def sliding_window(arr, window_size): n_samples = arr.shape[0] - window_size + 1 strides = (arr.strides[0],) + arr.strides shape = (n_samples, window_size) + arr.shape[1:] return np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides) windowed_arr = sliding_window(arr, 200)
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

