在左侧和右侧填充 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)。
我写了(在 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)。