fbpx

Numpy pour débutants – les indispensables !

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  arrnp.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.

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

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

Les entrées invalides d’un tableau sont parfois marquées par des valeurs négatives ou des chaînes de caractères. Si nous connaissons la valeur masquée, disons -999, nous pouvons également créer un tableau masqué en utilisant np.ma.masked_values(arr, value=-999). Toute opération de numpy prenant un tableau masqué comme argument ignorera automatiquement ces entrées invalides, comme indiqué ci-dessous.

import math
def is_prime(n):
  assert n > 1, 'Input must be larger than 1'
  if n % 2 == 0 and n > 2: 
     return False
  return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

arr = np.array(range(2,100))
non_prime_mask = [not is_prime(n) for n in a]
prime_arr = np.ma.MaskedArray(data=arr, mask=non_prime_mask)
print(prime_arr)
# [2 3 -- 5 -- 7 -- -- -- 11 -- 13 -- -- -- 17 -- 19 -- -- -- 23 -- -- -- --
# -- 29 -- 31 -- -- -- -- -- 37 -- -- -- 41 -- 43 -- -- -- 47 -- -- -- --
# -- 53 -- -- -- -- -- 59 -- 61 -- -- -- -- -- 67 -- -- -- 71 -- 73 -- --
# -- -- -- 79 -- -- -- 83 -- -- -- -- -- 89 -- -- -- -- -- -- -- 97 -- --]

arr = np.array(range(11))
print(arr.sum()) # 55

arr[-1] = -999 # indique la valeur manquante
masked_arr = np.ma.masked_values(arr, -999)
print(masked_arr.sum()) # 45

Merci pour votre lecture ! Si vous souhaitez lire nos prochains articles autour de la Data Science, vous pouvez nous suivre surFacebookLinkedIn et Twitter pour être notifié lorsqu’un nouvel article est publié !

Cet article a été inspiré par : 4 NumPy Tricks Every Python Beginner should Learn de Eden Au