fbpx

Numpy pour débutants – les indispensables !

Sujets abordés
S'abonner à la newsletter

4 astuces NumPy que tout débutant en Python devrait apprendre

Nos astuces pour écrire des codes lisibles

NumPy #0excludeGlossary Python,

#1excludeGlossary

1. Fonctions Arg – positions

#2excludeGlossary

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.

#3excludeGlossary

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

Partager cet article