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

3 astuces NumPy peu connues en une seule ligne [Python Puzzle]

Astuce n° 1 :Découpage et affectation de tranches

Ce one-liner démontre la puissance de trois fonctionnalités NumPy intéressantes et comment leur combinaison peut résoudre un petit problème de science des données de manière propre et efficace.

Supposons que vous travaillez dans une entreprise et que le comptable vous demande d'analyser les données salariales de différents employés de votre entreprise. Vous créez un tableau NumPy contenant les données pertinentes :chaque ligne donne le salaire annuel d'un professionnel (data scientist, chef de produit, concepteur ou ingénieur logiciel). Chaque colonne donne les années respectives (2017, 2018, 2019). Par conséquent, le tableau NumPy résultant a quatre lignes et trois colonnes.

Le comptable vous dit qu'il reste de l'argent et que la direction veut renforcer les professionnels les plus importants de l'entreprise. Vous convainquez le comptable de donner plus d'argent aux héros cachés de votre entreprise :les data scientists.

Formulation du problème : Quelle est la meilleure façon de mettre à jour le tableau NumPy afin que seuls les salaires des data scientists augmentent de 10 %, mais uniquement tous les deux ans à partir de la première année dans votre base de données ?

import numpy as np


## Data: salary in ($1000) [2017, 2018, 2019]
dataScientist =     [130, 132, 137]
productManager =    [127, 140, 145]
designer =          [118, 118, 127]
softwareEngineer =  [129, 131, 137]

employees = np.array([dataScientist,
                      productManager,
                      designer,
                      softwareEngineer])


employees[0,::2] = employees[0,::2] * 1.1


## Result
print(employees)

Voyons le résultat :

[[143 132 150]
 [127 140 145]
 [118 118 127]
 [129 131 137]]

La ligne en surbrillance utilise à la fois les concepts de découpage et d'affectation de tranches dans NumPy. Dans l'exemple, nous utilisons le découpage en tranches pour obtenir toutes les autres valeurs de la première ligne des employés du tableau NumPy. Ensuite, nous effectuons quelques modifications et mettons à jour toutes les autres valeurs de la première ligne en utilisant l'affectation de tranche. Cette procédure remplace le contenu de la première ligne du tableau NumPy par les données salariales mises à jour.

Astuce n° 2 :diffusion

Deuxièmement, bien que vous ne vous en soyez peut-être pas rendu compte, nous avons utilisé un concept puissant appelé "diffusion" dans NumPy.

La diffusion signifie que NumPy corrige automatiquement les opérations élémentaires des tableaux NumPy avec différentes formes. Par exemple, l'opérateur de multiplication * effectue généralement une multiplication élément par élément lorsqu'il est appliqué à des tableaux NumPy unidimensionnels ou multidimensionnels.

La diffusion décrit comment NumPy amène automatiquement deux tableaux de formes différentes à une forme compatible lors d'opérations arithmétiques. Généralement, le plus petit tableau est "répété" plusieurs fois jusqu'à ce que les deux tableaux aient la même forme. La diffusion est économe en mémoire car elle ne copie pas plusieurs fois le plus petit tableau.

Voici un exemple minimal :

import numpy as np

A = np.array([1, 2, 3])
res = A * 3 # scalar is broadcasted to [3 3 3]
print(res)
# [3 6 9]

En savoir plus sur cette puissante astuce NumPy dans notre guide détaillé :

Diffusion NumPy - Un guide illustré simple

Astuce n° 3 :Conversion de type automatique

Dans l'extrait de code suivant, vous vous rendrez compte que le type de données résultant n'est pas flottant mais entier - même si nous effectuons une arithmétique à virgule flottante.

import numpy as np

## Data: salary in ($1000) [2017, 2018, 2019]
dataScientist =     [130, 132, 137]
productManager =    [127, 140, 145]
designer =          [118, 118, 127]
softwareEngineer =  [129, 131, 137]

employees = np.array([dataScientist,
                      productManager,
                      designer,
                      softwareEngineer])

print(employees.dtype)
# int32

employees[0,::2] = employees[0,::2] * 1.1

print(employees.dtype)
# int32

La raison est simple si vous la connaissez :chaque tableau NumPy a un type de données associé (auquel vous pouvez accéder en utilisant le dtype propriété). Lors de la création du tableau, NumPy s'est rendu compte que le tableau ne contient que des valeurs entières. Le tableau est donc supposé être un tableau d'entiers. Ainsi, toute opération que vous effectuez sur le tableau d'entiers ne changera pas le type de données. NumPy arrondit à des valeurs entières.