Prendre efficacement des sous-tableaux à partir d'un tableau Numpy avec une foulée/une taille de pas donnée
Dans le monde de l'analyse de données, nous devons souvent extraire des sous-tableaux avec des foulées ou pas à partir d’un tableau plus large. Numpy, la bibliothèque Python populaire pour les opérations numériques, propose plusieurs méthodes pour y parvenir efficacement.
Énoncé du problème :
Étant donné un tableau Numpy, nous voulons extraire une matrice de sous-tableaux de une longueur fixe avec une foulée ou un pas spécifique. Une foulée est la distance entre le début de sous-tableaux consécutifs.
Discussion :
Une façon simple de créer des sous-tableaux consiste à parcourir le tableau d'origine à l'aide d'une boucle for. . Bien que cette approche fonctionne, elle peut être lente pour les grands tableaux.
Approche 1 : Diffusion
Le mécanisme de diffusion de NumPy nous permet de créer des sous-tableaux sans boucles. Nous pouvons utiliser la fonction suivante qui prend le tableau, la longueur du sous-tableau (L) et la foulée (S) :
def broadcasting_app(a, L, S): nrows = ((a.size - L) // S) + 1 return a[S * np.arange(nrows)[:, None] + np.arange(L)]
Explication :
np.arange(nrows) crée un tableau d'indices avec une foulée de 1. En multipliant cela par S, nous obtenons les indices de départ de chaque sous-tableau. Nous diffusons ensuite ces indices sur les lignes de a pour obtenir les sous-tableaux.
Approche 2 : NumPy Strides
Une autre méthode efficace utilise la fonctionnalité de foulées de NumPy. Les foulées représentent le nombre d'octets entre des éléments consécutifs le long de chaque axe. Nous pouvons utiliser ces informations pour créer des sous-tableaux :
def strided_app(a, L, S): nrows = ((a.size - L) // S) + 1 n = a.strides[0] return np.lib.stride_tricks.as_strided(a, shape=(nrows, L), strides=(S * n, n))
Explication :
Nous utilisons np.lib.stride_tricks.as_strided pour remodeler un en profitant de ses foulées. Le tableau résultant a le nombre de lignes (nrows) et la longueur de sous-tableau (L) souhaités, tout en conservant la foulée de S.
Exemple de code :
Pour illustrer le approches :
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) print(broadcasting_app(a, L=5, S=3)) print(strided_app(a, L=5, S=3))
Sortie :
[[ 1 2 3 4 5] [ 4 5 6 7 8] [ 7 8 9 10 11]] [[ 1 2 3 4 5] [ 4 5 6 7 8] [ 7 8 9 10 11]]
Les deux approches génèrent efficacement la matrice de sous-réseaux avec la foulée souhaitée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!