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
Barbara Streisandoriginal
2024-12-03 18:05:16271parcourir

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])

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]])

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)]

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))

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]]

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!

Déclaration:
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