Maison > développement back-end > Tutoriel Python > Comment extraire efficacement des sous-tableaux avec une foulée donnée à partir d'un tableau NumPy ?

Comment extraire efficacement des sous-tableaux avec une foulée donnée à partir d'un tableau NumPy ?

Patricia Arquette
Libérer: 2024-12-09 21:18:10
original
837 Les gens l'ont consulté

How to Efficiently Extract Subarrays with a Given Stride from a NumPy Array?

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)]
Copier après la connexion

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))
Copier après la connexion

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))
Copier après la connexion

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]]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal