Maison > développement back-end > Tutoriel Python > Comment extraire efficacement des sous-tableaux avec Strides dans NumPy ?

Comment extraire efficacement des sous-tableaux avec Strides dans NumPy ?

Barbara Streisand
Libérer: 2024-12-03 18:05:16
original
264 Les gens l'ont consulté

How to Efficiently Extract Subarrays with Strides in NumPy?

Extraction de sous-tableaux avec des foulées dans les tableaux Numpy

Considérez un tableau Python Numpy a :

a = numpy.array([1,2,3,4,5,6,7,8,9,10,11])
Copier après la connexion

Nous visons à extraire des sous-tableaux de longueur 5 avec une foulée de 3. Il en résulte une matrice avec le suivant contenu :

numpy.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
Copier après la connexion

Implémentation plus propre

Bien qu'une approche en boucle for soit viable, Numpy fournit des méthodes plus efficaces :

Approche 1 : Diffusion

Cette approche profite de diffusion :

def broadcasting_app(a, L, S ):  # Window len = L, Stride len/stepsize = S
    nrows = ((a.size-L)//S)+1
    return a[S*np.arange(nrows)[:,None] + np.arange(L)]
Copier après la connexion

Approche 2 : Optimisation des foulées

Cette méthode utilise les foulées efficaces de Numpy :

def strided_app(a, L, S ):  # Window len = L, Stride len/stepsize = 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

Exemple d'utilisation :

a = numpy.array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

broadcasting_app(a, L = 5, S = 3)
# [[ 1  2  3  4  5]
#  [ 4  5  6  7  8]
#  [ 7  8  9 10 11]]

strided_app(a, L = 5, S = 3)
# [[ 1  2  3  4  5]
#  [ 4  5  6  7  8]
#  [ 7  8  9 10 11]]
Copier après la connexion

Ces approches offrent des solutions plus efficaces et optimisées pour extraire des sous-tableaux avec des foulées dans les tableaux Numpy.

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