我写了(在SO的帮助下)一个函数,用于从一个系列L
中提取重叠a
的滑动窗口,在L右侧或左侧填充fillval
/(L-overlap)不是整数,使用numpy strides:
def strided_axis0_overlap(a, fillval, L,overlap,pad='left'): # a is 1D array
assert(overlap<L)
if pad=='left':
a_ext = np.concatenate(( np.full(L-1,fillval) ,a))
elif pad=='right':
a_ext = np.concatenate((a,np.full(L-1,fillval)))
n = a_ext.strides[0]
strided = np.lib.stride_tricks.as_strided
if pad=='left':
return strided(a_ext, shape=(a.shape[0],L), strides=(n,n))[[np.arange(0,len(a),L-overlap)],:]
elif pad=='right':
return strided(a_ext, shape=(a.shape[0],L), strides=(n,n))[[np.arange(0,len(a),L-overlap)],:]
除了填充之外,它工作得很好。 如果我做
v=np.array(range(182)).T
strided_axis0_overlap(v,np.nan,5*6,0,pad='right')
我得到了以下内容:
array([[[ 0., 1., 2., ..., 27., 28., 29.],
[ 30., 31., 32., ..., 57., 58., 59.],
[ 60., 61., 62., ..., 87., 88., 89.],
...,
[ 120., 121., 122., ..., 147., 148., 149.],
[ 150., 151., 152., ..., 177., 178., 179.],
[ 180., 181., nan, ..., nan, nan, nan]]])
但是,如果我在左边填充
array([[[ nan, nan, nan, ..., nan, nan, 0.],
[ 1., 2., 3., ..., 28., 29., 30.],
[ 31., 32., 33., ..., 58., 59., 60.],
...,
[ 91., 92., 93., ..., 118., 119., 120.],
[ 121., 122., 123., ..., 148., 149., 150.],
[ 151., 152., 153., ..., 178., 179., 180.]]])
虽然我希望最后一个窗口以182完成,而第一个窗口就像是 array [[[[nan,nan,nan,...,nan,0,1。],
答案 0 :(得分:1)
您始终填充L - 1
元素。在必须的情况下这是太多了,但是在右边填充的情况下它并不重要,因为忽略了数组末尾的多余元素。但是,在左边填充的情况下,这是显而易见的,因为从头开始的所有元素都在数组中结束。
在特定情况下,您插入29个元素,但只需要28个,因此数组中的最后一项将从滑动窗口中删除。
要插入的元素数量应取决于数组大小和窗口大小,如下所示:
L - (a.shape[0] - 1) % L - 1
这将评估使数组大小为窗口大小的整数倍所需的元素数(如果它们已经匹配,则可以为0)。