我使用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
完全正常,我会得到以下内容,这是出乎意料的,因为:
包含随机数而不是预期的nans,例如-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]]])
即使我使用
将结果转换回intres.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]]])
答案 0 :(得分:3)
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
需要适当的步幅,正确的形状和适当的填充。