提取numpy数组的滞后特征(+;展开维度)|用步长=1重塑numpy数组

提取numpy数组的滞后特征(+;展开维度)|用步长=1重塑numpy数组,numpy,time-series,lag,Numpy,Time Series,Lag,我有一个时间序列数据数组的形状(#时间戳,#特征)。我想为每一行(时间戳)n_lags(前几行)提取数据,并对数组进行整形,使其具有形状(#示例,#lags+now,#特征),以便输入到Keras的LSTM层 以这个玩具为例: import numpy as np n_rows = 6 n_feat= 3 n_lag = 2 a = np.array(range(n_rows*n_feat)).reshape(n_rows, n_feat) >>> a.shape = (6

我有一个时间序列数据数组的形状
(#时间戳,#特征)
。我想为每一行(
时间戳
n_lags
(前几行)提取数据,并对数组进行整形,使其具有形状
(#示例,#lags+now,#特征)
,以便输入到Keras的LSTM层

以这个玩具为例:

import numpy as np
n_rows = 6
n_feat= 3
n_lag = 2

a = np.array(range(n_rows*n_feat)).reshape(n_rows, n_feat)

>>> a.shape = (6, 3)
>>> a = array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11],
           [12, 13, 14],
           [15, 16, 17]])
通过对行进行迭代我获得了预期输出

b = np.empty(shape=(0, (n_lag + 1), n_feat))
for idx, row in enumerate(a):
   temp = np.expand_dims(a[max(0, idx-n_lag):idx+1, :], 0)
   if temp.shape[1:] == b.shape[1:]:
       b = np.append(b, temp, axis=0)


>>> b.shape = (4, 3, 3)
>>> b = array([[[ 0.,  1.,  2.],
            [ 3.,  4.,  5.],
            [ 6.,  7.,  8.]],

           [[ 3.,  4.,  5.],
            [ 6.,  7.,  8.],
            [ 9., 10., 11.]],

           [[ 6.,  7.,  8.],
            [ 9., 10., 11.],
            [12., 13., 14.]],

           [[ 9., 10., 11.],
            [12., 13., 14.],
            [15., 16., 17.]]])
注意:第一行
n_lags-1
没有足够的数据,将在最终输出中丢弃

问题: 我想知道是否有一种比在行上迭代更优雅/漂亮的方法。

您可以使用新的方法进行此操作

n_行=6
n_feat=3
n_滞后=2
a=np.数组(范围(n行*n专长)).重塑(n行,n专长)
b=np.lib.stride\u tricks.slide\u window\u view(a,window\u shape=(n\u feat,n\u feat))
B
输出:

array([[[[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8]]],


       [[[ 3,  4,  5],
         [ 6,  7,  8],
         [ 9, 10, 11]]],


       [[[ 6,  7,  8],
         [ 9, 10, 11],
         [12, 13, 14]]],


       [[[ 9, 10, 11],
         [12, 13, 14],
         [15, 16, 17]]]])

b
只会改变
a
的形状和步幅,因此它会多次包含
a
的相同内存位置。换句话说,不需要分配新数组。

不是
keras
lstm
问题,请不要发送不相关的标签(已删除)。由于此问题旨在根据
keras
lstm
格式化数据,我预计有些人会发现看到这种联系很有趣。从未打算垃圾邮件标签,但感谢编辑标签的准则!没问题;对于将来,请记住标签应该只与问题的内容有关,而不是它的(一般)上下文。只是对代码的一个小注释
np.array(范围(n行*n行专长))
可以替换为
np.arange(n行*n行专长)
。不需要使用原始python生成器。这正是我要找的!非常感谢!不过,这是一个非常新的方法,必须首先更新Numpy:)