Вот один с np.lib.stride_tricks.as_strided
, чтобы дать нам 2D
представление для дополненной нулями версии ввода 1D
и, как таковую, довольно эффективной памяти и, следовательно, производительной.Этот трюк был исследован много раз - 1
, 2
.
Таким образом, реализация будет -
def sliding_windows(a, W):
a = np.asarray(a)
p = np.zeros(W-1,dtype=a.dtype)
b = np.concatenate((p,a,p))
s = b.strides[0]
strided = np.lib.stride_tricks.as_strided
return strided(b[W-1:], shape=(W,len(a)+W-1), strides=(-s,s))
Примеры прогонов -
In [99]: a = [1,2,3]
In [100]: sliding_windows(a, W=3)
Out[100]:
array([[1, 2, 3, 0, 0],
[0, 1, 2, 3, 0],
[0, 0, 1, 2, 3]])
In [101]: a = [1,2,3,4,5]
In [102]: sliding_windows(a, W=3)
Out[102]:
array([[1, 2, 3, 4, 5, 0, 0],
[0, 1, 2, 3, 4, 5, 0],
[0, 0, 1, 2, 3, 4, 5]])
С той же философией, но менее сложной версией, мы можем также использовать np.lib.stride_tricks.as_strided
на основе scikit-image's view_as_windows
, чтобы получить скользящие окна. Подробнее об использовании as_strided
на основе view_as_windows
.
from skimage.util.shape import view_as_windows
def sliding_windows_vw(a, W):
a = np.asarray(a)
p = np.zeros(W-1,dtype=a.dtype)
b = np.concatenate((p,a,p))
return view_as_windows(b,len(a)+W-1)[::-1]