4 astuces NumPy que tout débutant en Python devrait apprendre
Nos astuces pour écrire des codes lisibles
NumPy est l’une des bibliothèques les plus populaires de Python,
et presque tous les programmeurs Python l’ont utilisée pour le calcul arithmétique compte tenu de ses avantages. Les tableaux Numpy sont plus compacts que les listes Python. Cette bibliothèque est également très pratique avec de nombreuses opérations matricielles courantes implémentées de manière très efficace en termes de calcul.
Après avoir aidé mes collègues et amis à résoudre leurs problèmes avec numpy, j’ai trouvé 4 astuces numpy qu’un débutant en Python devrait apprendre. Ces astuces vous aideront à écrire des codes plus soignés et plus lisibles.
Avant d’apprendre les astuces numpy, assurez-vous d’être familier avec certaines fonctionnalités intégrées de Python dans l’article suivant.
1. Fonctions Arg – positions
Pour un tableau arr
, np.argmax(arr)
, np.argmin(arr)
, et np.argwhere(condition(arr))
renvoient respectivement les indices des valeurs maximales, des valeurs minimales, et des valeurs qui satisfont une condition définie par l’utilisateur. Bien que ces fonctions arg soient largement utilisées, nous négligeons souvent la fonction np.argsort()
qui renvoie les indices permettant de trier un tableau.
Nous pouvons utiliser np.argsort
pour trier les valeurs d’un tableau en fonction d’un autre tableau.
Voici un exemple de tri de noms d’étudiants en fonction de leurs notes d’examen.
Le tableau de noms trié peut également être ramené à son ordre initial à l’aide de np.argsort(np.argsort(score)).
score = np.array([70, 60, 50, 10, 90, 40, 80]) name = np.array(['Ada', 'Ben', 'Charlie', 'Danny', 'Eden', 'Fanny', 'George']) sorted_name = name[np.argsort(score)] # an array of names in ascending order of their scores print(sorted_name) # ['Danny' 'Fanny' 'Charlie' 'Ben' 'Ada' 'George' 'Eden'] original_name = sorted_name[np.argsort(np.argsort(score))] print(original_name) # ['Ada' 'Ben' 'Charlie' 'Danny' 'Eden' 'Fanny' 'George'] %timeit name[np.argsort(score)] # 1.83 µs ± 182 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) %timeit sorted(zip(score, name)) # 3.2 µs ± 76.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Ses performances sont plus rapides que celles de la fonction Python intégrée sorted(zip())
, et sont sans doute plus lisibles.
2. Broadcasting — shapes
La diffusion est quelque chose qu’un débutant en numpy peut avoir essayé de faire par inadvertance. De nombreuses opérations arithmétiques de numpy sont appliquées sur des paires de tableaux ayant les mêmes formes sur une base élément par élément. La diffusion vectorise les opérations sur les tableaux sans faire de copies inutiles des données. Cela conduit à des implémentations d’algorithmes efficaces et à une meilleure lisibilité du code.
Par exemple, vous pouvez utiliser l’incrémentation de toutes les valeurs d’un tableau par 1 à l’aide de la commande arr + 1
quelle que soit la dimension de arr
. Vous pouvez également vérifier si toutes les valeurs d’un tableau sont supérieures à 2 par arr > 2
.
Mais comment savoir si deux réseaux sont compatibles avec la diffusion ?
Argument 1 (4D array): 7 × 5 × 3 × 1 Argument 2 (3D array): 1 × 3 × 9 Output (4D array): 7 × 5 × 3 × 9
Chaque dimension des deux tableaux doit être égale ou l’une d’entre elles doit être égale à 1. Il n’est pas nécessaire qu’ils aient le même nombre de dimensions. Ces règles sont illustrées dans l’exemple ci-dessus.
3. Ellipsis and NewAxis — dimensions
La syntaxe pour trancher un tableau numpy est i:j
où i, j sont respectivement l’indice de départ et l’indice d’arrêt. Par exemple, pour un tableay numpy array arr = np.array(range(10))
, appelle arr[:3]
qui nous donne [0, 1, 2]
.
Lorsque l’on traite des tableaux de dimensions supérieures, on utilise : pour sélectionner les indices entiers le long de chaque axe. Nous pouvons également utiliser … pour sélectionner tous les indices sur plusieurs axes. Le nombre exact d’axes développés est déduit.
arr = np.array(range(1000)).reshape(2,5,2,10,-1) print(arr[:,:,:,3,2] == arr[...,3,2]) # [[[ True, True], # [ True, True], # [ True, True], # [ True, True], # [ True, True]], # [ True, True], # [ True, True], # [ True, True], # [ True, True]]]) print(arr.shape) # (2, 5, 2, 10, 5) print(arr[...,np.newaxis,:,:,:].shape) # (2, 5, 1, 2, 10, 5)
D’autre part, l’utilisation de np.newaxis
comme indiqué ci-dessus insère un nouvel axe à une position d’axe définie par l’utilisateur. Cette opération permet d’étendre la forme d’un tableau d’une unité de dimension. Bien que cette opération puisse également être effectuée par np.expand_dims()
, l’utilisation de np.newaxis
est beaucoup plus lisible et sans doute plus élégante.
4. Masked Array — selection
Les ensembles de données sont imparfaits. Elles contiennent toujours des tableaux avec des entrées manquantes ou invalides, et nous voulons souvent ignorer ces entrées. Par exemple, les mesures d’une station météorologique peuvent contenir des valeurs manquantes en raison d’une défaillance du capteur.
Numpy possède un sous-module numpy.ma
qui prend en charge les tableaux de données avec des masques. Un tableau masqué contient un tableau numpy ordinaire et un masque qui indique la position des entrées invalides.
np.ma.MaskedArray(data=arr, mask=invalid_mask)
Cet article a été inspiré par : 4 NumPy Tricks Every Python Beginner should Learn de Eden Au