Python >> Tutoriel Python >  >> Python Tag >> NumPy

Comment utiliser l'affectation de tranches dans NumPy ?

L'affectation de tranche NumPy vous permet d'utiliser le découpage sur le côté gauche d'une opération d'affectation pour écraser une sous-séquence spécifique d'un tableau NumPy à la fois. Le côté droit de l'opération d'affectation de tranche fournit le nombre exact d'éléments pour remplacer la tranche sélectionnée. Par exemple, a[::2] = [...] écraserait toutes les autres valeurs du tableau NumPy a .

Voici un exemple minimal d'affectation de tranche :

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[2:5] = [40, 41, 42]
>>> a
array([ 1,  2, 40, 41, 42,  6,  7,  8,  9])

L'opération d'affectation de tranche NumPy n'a pas besoin de la même forme à gauche et à droite car NumPy utilisera la diffusion pour amener la structure de données de type tableau fournissant les valeurs de données de remplacement dans la même forme que le tableau à écraser.

L'exemple suivant montre comment remplacer toutes les autres valeurs d'un tableau 1D par la même valeur. Les opérandes gauche et droit n'ont pas la même forme de tableau, mais NumPy le comprend grâce à la diffusion.

>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[::2] = 42
>>> a
array([42,  2, 42,  4, 42,  6, 42,  8, 42])

Pour les tableaux 2D, vous pouvez utiliser la notation de tranche avancée (sélection séparée par des virgules par axe) pour remplacer des colonnes entières comme suit :

>>> a = np.array([[1, 2, 3],
	          [4, 5, 6]])
>>> a[:, 0] = 42
>>> a
array([[42,  2,  3],
       [42,  5,  6]])

Plongeons-nous dans un exemple pratique sur les affectations de tranches NumPy de mon livre Python One-Liners ensuite. Prenez votre temps pour l'étudier et regardez la vidéo explicative pour peaufiner vos compétences en matière de découpage NumPy une fois pour toutes.

Exemple pratique d'affectation de tranches NumPy

Les données du monde réel sont rarement propres :elles peuvent contenir des erreurs en raison d'un capteur défectueux, ou elles peuvent contenir des données manquantes en raison de capteurs endommagés. Dans cet exemple en une seule ligne, vous apprendrez à gérer rapidement des tâches de nettoyage plus petites en une seule ligne de code.

Supposons que vous ayez installé un capteur de température dans votre jardin pour mesurer les données de température sur une période de plusieurs semaines. Tous les dimanches, vous désinstallez le capteur de température du jardin et l'emportez chez vous pour numériser les valeurs du capteur. Maintenant, vous vous rendez compte que les valeurs des capteurs du dimanche sont erronées car elles ont partiellement mesuré la température chez vous et non à l'extérieur.

Dans ce projet de mini-code, vous souhaitez "nettoyer" vos données en remplaçant chaque valeur de capteur du dimanche par la valeur moyenne du capteur des sept derniers jours. Mais avant de plonger dans le code, explorons les concepts les plus importants dont vous avez besoin comme compréhension de base.

Exemples d'affectation de tranche NumPy

Dans la fonction d'affectation de tranches de NumPy, vous spécifiez les valeurs à remplacer sur le côté gauche de l'équation et les valeurs qui les remplacent sur le côté droit de l'équation.

Voici un exemple :

import numpy as np


a = np.array([4] * 16)
print(a)
# [4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4]

a[1::] = [16] * 15
print(a)
# [ 4 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16]

L'extrait de code crée un tableau contenant 16 fois la valeur 4. Ensuite, nous utilisons l'affectation de tranche pour remplacer les 15 valeurs de séquence de fin par la valeur 16. Rappelez-vous que la notation a[start:stop:step] sélectionne la séquence commençant à l'index "start ”, se terminant par l'index “stop” (exclusif), et ne considérant que chaque “étape”-ième élément de séquence. Ainsi, la notation a[1::] remplace tous les éléments de séquence sauf le premier.

import numpy as np


a = np.array([4] * 16)

a[1:8:2] = 16
print(a)
# [ 4 16  4 16  4 16  4 16  4  4  4  4  4  4  4  4]

Cet exemple montre comment utiliser l'affectation de tranche avec tous les paramètres spécifiés. Une variante intéressante est que nous ne spécifions qu'une seule valeur "16" pour remplacer les éléments sélectionnés. Connaissez-vous déjà le nom de cette fonctionnalité ?

Correct, la diffusion est le nom du jeu ! Le côté droit de l'équation est automatiquement transformé en un tableau NumPy. La forme de ce tableau est égale au tableau de gauche.

Avant d'étudier comment résoudre le problème avec un nouveau one-liner, permettez-moi d'expliquer rapidement la propriété de forme des tableaux NumPy. Chaque tableau a un attribut de forme associé (un tuple). Le i-th la valeur du tuple spécifie le nombre d'éléments du i-th axe. Par conséquent, le nombre de valeurs de tuple est la dimensionnalité du tableau NumPy.

Lisez les exemples suivants sur les formes des différents tableaux :

import numpy as np


a = np.array([1, 2, 3])
print(a)
"""
[1 2 3]
"""
print(a.shape)
# (3,)

b = np.array([[1, 2, 3],
              [4, 5, 6]])
print(b)
"""
[[1 2 3]
 [4 5 6]]
"""
print(b.shape)
# (2, 3)

c = np.array([[[1, 2, 3], [4, 5, 6]],
              [[7, 8, 9], [10, 11, 12]]])
print(c)
"""
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]
"""
print(c.shape)
# (2, 2, 3)

Nous créons trois tableaux a , b , et c .

  • Le tableau a est 1D, donc le tuple de forme n'a qu'un seul élément.
  • Tableau b est 2D, donc le tuple de forme a deux éléments.
  • Tableau c est 3D, donc le tuple de forme a trois éléments.

Formulation du problème

Voici tout ce que vous devez savoir pour résoudre le problème suivant :

Étant donné un tableau de valeurs de température, remplacez une valeur de température sur sept par la moyenne des sept derniers jours.

Solution

## Dependencies
import numpy as np

## Sensor data (M, T, W, T, F, Sa, Su)
tmp = np.array([1, 2, 3, 4, 3, 4, 4,
                5, 3, 3, 4, 3, 4, 6,
                6, 5, 5, 5, 4, 5, 5])


## One-liner
tmp[6::7] = np.average(tmp.reshape((-1,7)), axis=1)


## Result
print(tmp)

Essayer de deviner  :quel est le résultat de cet extrait de code ?

Tout d'abord, le puzzle crée la matrice de données "tmp ” avec une séquence unidimensionnelle de valeurs de capteur. Dans chaque ligne, nous définissons les sept valeurs de capteur pour sept jours de la semaine (lundi, mardi, mercredi, jeudi, vendredi, samedi et dimanche).

Deuxièmement, nous utilisons l'affectation de tranches pour remplacer toutes les valeurs du dimanche de ce tableau. Le dimanche étant le septième jour de la semaine, l'expression "tmp[6::7] ” sélectionne les valeurs respectives du dimanche à partir du septième élément de la séquence (à nouveau :la valeur du capteur du dimanche).

Troisièmement, nous remodelons le réseau de capteurs unidimensionnel en un réseau bidimensionnel à sept colonnes. Cela nous permet de calculer plus facilement la valeur de température moyenne hebdomadaire pour remplacer les données du dimanche. Notez que la valeur de tuple de forme fictive -1 (dans "tmp.reshape((-1,7)) ”) signifie que le nombre de lignes (axis 0 ) doit être sélectionné automatiquement. Dans notre cas, il en résulte le tableau suivant après remodelage :

print(tmp.reshape((-1,7)))
"""
[[1 2 3 4 3 4 4]
 [5 3 3 4 3 4 6]
 [6 5 5 5 4 5 5]]
"""

C'est une ligne par semaine et une colonne par jour de semaine.

Nous calculons maintenant la moyenne sur 7 jours en regroupant chaque ligne en une seule valeur moyenne à l'aide de np.average() fonction avec le axis argument :axis=1 signifie que le deuxième axe est réduit à une seule valeur moyenne. Voici le résultat du membre de droite de l'équation :

print(np.average(tmp.reshape((-1,7)), axis=1))
# [3. 4. 5.]

Après avoir remplacé toutes les valeurs des capteurs du dimanche, nous obtenons le résultat final suivant du one-liner :

# [1 2 3 4 3 4 3 5 3
3 4 3 4 4 6 5 5 5 4 5 5]

Cet exemple est tiré de mon livre Python One-Liners :

Livre Python One-Liners :maîtrisez d'abord la ligne unique !

Les programmeurs Python amélioreront leurs compétences en informatique avec ces lignes utiles.

Python One-Liners vous apprendra à lire et à écrire des « lignes simples » :des déclarations concises de fonctionnalités utiles regroupées dans une seule ligne de code. Vous apprendrez à décompresser et à comprendre systématiquement n'importe quelle ligne de code Python, et à écrire du Python éloquent et puissamment compressé comme un expert.

Les cinq chapitres du livre couvrent (1) les trucs et astuces, (2) les expressions régulières, (3) l'apprentissage automatique, (4) les principaux sujets de science des données et (5) les algorithmes utiles.

Des explications détaillées des one-liners introduisent les concepts clés de l'informatique etdéveloppez vos compétences en matière de codage et d'analyse . Vous découvrirez les fonctionnalités Python avancées telles que la compréhension de liste , tranchage , fonctions lambda , expressions régulières , carte et réduire fonctions et affectations de tranches .

Vous apprendrez également à :

  • Exploiter les structures de données pour résoudre des problèmes réels , comme utiliser l'indexation booléenne pour trouver des villes avec une pollution supérieure à la moyenne
  • Utiliser les bases de NumPy comme tableau , forme , axe , tapez , diffusion , indexation avancée , tranchage , tri , recherche , agrégation , et statistiques
  • Calculer des statistiques de base de tableaux de données multidimensionnels et les algorithmes K-Means pour l'apprentissage non supervisé
  • Créer davantage d'expressions régulières avancées en utilisant le regroupement et groupes nommés , anticipations négatives , caractères échappés , espaces blancs, jeux de caractères (et jeux de caractères négatifs ) et opérateurs gourmands/non gourmands
  • Comprendre un large éventail de sujets informatiques , y compris les anagrammes , palindromes , surensembles , permutations , factorielles , nombres premiers , Fibonacci chiffres, obscurcissement , recherche , et tri algorithmique

À la fin du livre, vous saurez comment écrire Python dans sa forme la plus raffinée , et créez de belles pièces concises d'"art Python" en une seule ligne.

Obtenez vos Python One-Liners sur Amazon !!