左侧和右侧的填充numpy步幅

时间:2018-01-26 07:15:41

标签: python numpy sliding-window stride

我写了(在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。],

1 个答案:

答案 0 :(得分:1)

您始终填充L - 1元素。在必须的情况下这是太多了,但是在右边填充的情况下它并不重要,因为忽略了数组末尾的多余元素。但是,在左边填充的情况下,这是显而易见的,因为从头开始的所有元素都在数组中结束。

在特定情况下,您插入29个元素,但只需要28个,因此数组中的最后一项将从滑动窗口中删除。

要插入的元素数量应取决于数组大小和窗口大小,如下所示:

L - (a.shape[0] - 1) % L - 1

这将评估使数组大小为窗口大小的整数倍所需的元素数(如果它们已经匹配,则可以为0)。