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.
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.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 surFacebook, LinkedIn 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