J'ai un tenseur avec une taille : torch.Size([118160, 1])
. Ce que je veux faire, c'est le diviser en n tenseurs de 100 éléments chacun, en glissant par 50 éléments à la fois. Quelle est la meilleure façon d'y parvenir avec PyTorch ?
Réponses
Trop de publicités?Votre nombre d'éléments doit être divisible par 100. Si ce n'est pas le cas, vous pouvez l'ajuster avec le padding.
Vous pouvez d'abord effectuer un fractionnement sur la liste originale. Puis faire un split sur la liste où les 50 premiers éléments sont retirés de la liste originale. Vous pouvez ensuite échantillonner en alternant l'ordre de A et B si vous voulez préserver l'ordre original.
A = yourtensor
B = yourtensor[50:] + torch.zeros(50,1)
A_ = A.view(100,-1)
B_ = B.view(100,-1)
Une solution possible :
window_size = 100
stride = 50
splits = [x[i:min(x.size(0),i+window_size)] for i in range(0,x.size(0),stride)]
Cependant, les derniers éléments seront plus courts que ceux de l'année précédente. window_size
. Si cela n'est pas souhaité, vous pouvez le faire :
splits = [x[i:i+window_size] for i in range(0,x.size(0)-window_size+1,stride)]
EDIT :
Une solution plus lisible :
# 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