我正在使用np.lib.stride_tricks.as_strided
生成滑动窗口 使用以下方法
wsize=4
overlap=0
vector=np.array(range(31))
fillval=np.nan
part_to_fill=np.full(wsize - (vector.shape[0] - 1) % wsize - 1,fillval)
a_ext = np.concatenate(( vector,part_to_fill))
n = a_ext.strides[0]
strided = np.lib.stride_tricks.as_strided
res=strided(a_ext, shape=(vector.shape[0],wsize), strides=(n,n))[[np.arange(0,len(vector),wsize-overlap)],:]
如果overlap=0
一切都很好,我得到
array([[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
...,
[ 20., 21., 22., 23.],
[ 24., 25., 26., 27.],
[ 28., 29., 30., nan]]])
但是,如果overlap=1
一切都很好并且我得到以下内容,这是出乎意料的,因为:
- 结果被强制转换为浮点 数
包含随机数而不是预期的 nan,例如 -3.25951556e-311
array([[[ 0.00000000e+000, 1.00000000e+000, 2.00000000e+000, 3.00000000e+000], [ 3.00000000e+000, 4.00000000e+000, 5.00000000e+000, 6.00000000e+000], [ 6.00000000e+000, 7.00000000e+000, 8.00000000e+000, 9.00000000e+000], ..., [ 2.40000000e+001, 2.50000000e+001, 2.60000000e+001, 2.70000000e+001], [ 2.70000000e+001, 2.80000000e+001, 2.90000000e+001, 3.00000000e+001], [ 3.00000000e+001, nan, 0.00000000e+000, -3.25951556e-311]]])
即使我使用
res.astype(int)
我得到以下内容,可能会更糟
array([[[ 0, 1, 2, 3],
[ 3, 4, 5, 6],
[ 6, 7, 8, 9],
...,
[ 24, 25, 26, 27],
[ 27, 28, 29, 30],
[ 30, -2147483648, 0, 0]]])
np.nan
是一个浮点数。 将其连接到整数数组会生成一个浮点数组。
In [101]: x = np.arange(5)
In [102]: np.concatenate((x, np.full(3, np.nan))) # x1=...
Out[102]: array([ 0., 1., 2., 3., 4., nan, nan, nan])
In [106]: n=x1.strides[0]
In [107]: strided(x1, shape=(5,3), strides=(n,n))
Out[107]:
array([[ 0., 1., 2.],
[ 1., 2., 3.],
[ 2., 3., 4.],
[ 3., 4., nan],
[ 4., nan, nan]])
如果我没有用足够的nan
填充它,我会在这些额外的插槽中获得"随机"值。 这部分原因as_strided
是先进的,并且具有潜在的危险性。
我不明白你为什么要在跨步后通过索引来应用该overlap
。 以下是我如何通过调整步幅来执行重叠:
In [110]: strided(x1, shape=(5,3), strides=(2*n,n))
Out[110]:
array([[ 0.00000000e+000, 1.00000000e+000, 2.00000000e+000],
[ 2.00000000e+000, 3.00000000e+000, 4.00000000e+000],
[ 4.00000000e+000, nan, nan],
[ nan, nan, nan],
[ nan, nan, 2.59784163e-306]])
哎呀,我要求的数组太大(或填充不足(:
In [112]: strided(x1, shape=(3,3), strides=(2*n,n))
Out[112]:
array([[ 0., 1., 2.],
[ 2., 3., 4.],
[ 4., nan, nan]])
代码添加单个nan
填充。 让我们将其更改为 10(只是一个方便的较大数字(。 并在没有索引的情况下计算(以获得所有步幅行(:
In [123]: res.shape
Out[123]: (31, 4)
In [124]: res
Out[124]:
array([[ 0., 1., 2., 3.],
[ 1., 2., 3., 4.],
[ 2., 3., 4., 5.],
[ 3., 4., 5., 6.],
...
[ 27., 28., 29., 30.],
[ 28., 29., 30., nan],
[ 29., 30., nan, nan],
[ 30., nan, nan, nan]])
现在您可以选择每 n 行,没有任何有趣的值(浮点nan
除外(。
因此as_strided
需要适当的步幅、适当的形状和适当的填充。