在左侧和右侧填充 numpy 步幅

padding numpy strides on left and right side

我写了(在 SO 的帮助下)一个函数,用于从 serie a 中提取具有重叠 L 的滑动 windows,用 fillval 填充当 L/(L-overlap) 不是整数时的右侧或左侧,使用 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.]]])

而我希望最后一个 window 以 182 结尾,而第一个就像 阵列([[南,南,南,...,南,0,1。],

您总是填充 L - 1 个元素。这在 must 情况下太多了,但在右填充的情况下无关紧要,因为数组末尾的多余元素将被忽略。但是,在左填充的情况下,这是值得注意的,因为从头开始的所有元素都在数组中结束。

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

中删除

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

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

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