Возможное решение:
window_size = 100
stride = 50
splits = [x[i:min(x.size(0),i+window_size)] for i in range(0,x.size(0),stride)]
Однако последние несколько элементов будут короче window_size
. Если это нежелательно, вы можете сделать:
splits = [x[i:i+window_size] for i in range(0,x.size(0)-window_size+1,stride)]
РЕДАКТИРОВАТЬ:
Более читаемое решение:
# if keep_short_tails is set to True, the slices shorter than window_size at the end of the result will be kept
def window_split(x, window_size=100, stride=50, keep_short_tails=True):
length = x.size(0)
splits = []
if keep_short_tails:
for slice_start in range(0, length, stride):
slice_end = min(length, slice_start + window_size)
splits.append(x[slice_start:slice_end])
else:
for slice_start in range(0, length - window_size + 1, stride):
slice_end = slice_start + window_size
splits.append(x[slice_start:slice_end])
return splits