Je comprends que des questions similaires ont déjà été publiées ici, mais je n'arrive pas à np.lib_stride_tricks.as_strided comment fonctionne np.lib_stride_tricks.as_strided . Je voudrais savoir s'il existe une fonction numpy qui me permet de faire le mappage suivant de a -> b efficacement:
import numpy as np
a = np.random.rand(100000,3)
window_length = 200;
spacing = 20;
b = []
for i in range(0,a.shape[0] - window_length,spacing):
b.append(a[i:i+window_length,:])
b = np.asarray(b);
print(b.shape)
Quelles sorties (4490,200,3) .
3 Réponses :
Nous pouvons exploiter np.lib.stride_tricks.as_strided basé sur np.lib.stride_tricks.as_strided scikit-image's view_as_windows pour obtenir des vues fenêtrées glissantes et ainsi résoudre notre problème ici de manière vectorisée.
from skimage.util.shape import view_as_windows w = view_as_windows(a, (window_length,1), step=(spacing,1))[...,0] # If needed, get into desired permuted axes format out = w.swapaxes(1,2)
Plus d'informations sur l'utilisation de as_strided basé sur view_as_windows . Si scikit-image n'est pas disponible, nous pouvons directement utiliser le source code qui fonctionne de manière autonome.
Une utilisation directe de as_strided :
strides = a.strides
new_len = (a.shape[0]-window_length+1)//spacing
b = as_strided(a,shape=(new_len,window_length, a.shape[1]),
strides=(strides[0]*spacing,) + strides)
Pour générer votre tableau à l'aide de stride_tricks, procédez comme suit:
from numpy.lib.stride_tricks import as_strided as stride
d0, d1 = a.shape
s0, s1 = a.strides
b2 = stride(a,
((d0 - window_length + 1) // spacing, window_length, d1),
(s0 * spacing, s0, s1))
J'ai délibérément choisi un nom de tableau différent ( b2 ).
Pour vérifier que mon code donne un résultat correct:
np.array_equal(b, b2) .Le résultat doit être vrai .
Notez que pour utiliser l'étendue complète, utilisez
for i in range(0,a.shape[0] - window_length+1,spacing):Tous les tableaux
numpysont stockés dans des segments de mémoire contigus et linéaires.stridesdéfinissent essentiellement le saut que vous faites le long de chaque dimension des données, pour obtenir l'illusion d'un tableau multidimensionnel. Dites si le tableau est[1, 2, 3, 4]et que vous définissez les sauts le long des axes x et y comme 1 et 2, alors le tableau 2D virtuel serait[ [1, 2], [3, 4] ]. Notez que le long des lignes, les éléments (disons 1 et 2) sont stockés de manière contiguë, tandis que le long des colonnes, vous devez sauter 2 emplacements dans le tableau d'origine pour accéder à l'élément (1 et 3).