【问题标题】:padding numpy strides on left and right side在左侧和右侧填充 numpy 步幅
【发布时间】:2018-01-26 07:15:40
【问题描述】:

我写了一个函数(在 SO 的帮助下)从意式 a 中提取具有重叠 L 的滑动窗口,当 L/(L-重叠)时在右侧或左侧填充 fillval不是整数,使用 numpy 步幅:

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 结尾,而第一个窗口就像 数组([[[ nan, nan, nan, ..., nan, 0, 1.],

【问题讨论】:

    标签: python numpy sliding-window stride


    【解决方案1】:

    你总是填充L - 1 元素。这在必须的情况下太多了,但在右填充的情况下,这并不重要,因为数组末尾的多余元素被忽略了。但是,在左侧填充的情况下,这是值得注意的,因为从头开始的所有元素都在数组中结束。

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

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

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

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

    【讨论】: