sous-échantillonnage à chaque nième entrée dans un tableau numpy

93

Je suis un débutant avec numpy, et j'essaie d'extraire des données d'un long tableau numpy. Ce que je dois faire, c'est commencer à partir d'une position définie dans mon tableau, puis sous-échantillonner chaque nième point de données à partir de cette position, jusqu'à la fin de mon tableau.

fondamentalement si j'avais

a = [1,2,3,4,1,2,3,4,1,2,3,4....] 

Je veux sous-échantillonner ceci pour commencer à a[1], puis échantillonner tous les quatre points à partir de là, pour produire quelque chose comme

b = [2,2,2.....]
Rich Williams
la source

Réponses:

154

Vous pouvez utiliser le tranchage de numpy , simplement start:stop:step.

>>> xs
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
>>> xs[1::4]
array([2, 2, 2])

Cela crée une vue des données d'origine, donc c'est un temps constant . Il reflétera également les modifications apportées au tableau d'origine et conservera l'ensemble du tableau d'origine en mémoire:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2]         # O(1), constant time
>>> b[:] = 0           # modifying the view changes original array
>>> a                  # original array is modified
array([0, 2, 0, 4, 0])

donc si l'une des choses ci-dessus pose un problème, vous pouvez en faire une copie explicitement:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2].copy()  # explicit copy, O(n)
>>> b[:] = 0           # modifying the copy
>>> a                  # original is intact
array([1, 2, 3, 4, 5])

Ce n'est pas un temps constant, mais le résultat n'est pas lié au tableau d'origine. La copie est également contiguë en mémoire, ce qui peut accélérer certaines opérations.

behzad.nouri
la source
1
merci pour l'avertissement concernant la copie de référence / valeur. Sinon, je tomberais certainement dans le piège
Chris