Ajout efficace d’éléments aux tableaux NumPy
NumPy, pierre angulaire de l’écosystème de calcul scientifique Python, fournit de puissants objets de tableaux N-dimensionnels. Ces tableaux offrent des avantages de performance significatifs par rapport aux listes Python standard, mais l’ajout direct d’éléments n’est pas aussi simple ou efficace qu’on pourrait le croire. Ce tutoriel explore des alternatives efficaces à l’ajout d’éléments aux tableaux NumPy.
Table des matières
- Introduction
- Pourquoi éviter l’ajout direct ?
- Préallocation
- Concaténation
- Empilement vertical et horizontal
- List Comprehension et création de tableau
- Choisir la bonne méthode
- Conclusion
Introduction
Les tableaux NumPy sont conçus pour des opérations numériques efficaces. Leur taille fixe contribue significativement à cette efficacité. Contrairement aux listes Python, qui redimensionnent dynamiquement, tenter d’ajouter directement des éléments à un tableau NumPy en utilisant des méthodes similaires à la méthode append()
d’une liste entraîne une erreur. Cela est dû au fait que le redimensionnement nécessite la création d’un tableau entièrement nouveau, la copie des anciennes données, puis l’ajout du nouvel élément – une opération coûteuse en calcul, surtout pour les grands tableaux et les ajouts fréquents.
Pourquoi éviter l’ajout direct ?
L’ajout direct aux tableaux NumPy est inefficace car il implique la création et la copie répétées de tableaux. Cela conduit à une dégradation significative des performances, surtout lorsqu’il s’agit de grands ensembles de données ou d’opérations d’ajout fréquentes. Les frais généraux d’allocation de mémoire et de transfert de données dépassent de loin l’avantage d’un simple ajout.
Préallocation
L’approche la plus efficace consiste souvent à préallouer un tableau de la taille finale souhaitée, puis à le remplir itérativement. Cela évite la création répétée de tableaux inhérente aux ajouts répétés.
import numpy as np
size = 1000
arr = np.empty(size, dtype=int) # Spécifier dtype pour de meilleures performances
for i in range(size):
arr[i] = i * 2 # Remplir avec des valeurs
print(arr)
Concaténation
numpy.concatenate
joint efficacement les tableaux existants le long d’un axe existant. Ceci est idéal lorsque vous avez plusieurs tableaux que vous souhaitez combiner.
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr_combined = np.concatenate((arr1, arr2))
print(arr_combined) # Résultat : [1 2 3 4 5 6]
arr3 = np.array([[1,2],[3,4]])
arr4 = np.array([[5,6],[7,8]])
arr_combined_2d = np.concatenate((arr3,arr4), axis=0) #axis=0 pour la concaténation verticale, axis=1 pour l'horizontale
print(arr_combined_2d)
Empilement vertical et horizontal
Pour l’empilement vertical (ligne par ligne) et horizontal (colonne par colonne) des tableaux, numpy.vstack
et numpy.hstack
fournissent des fonctions pratiques.
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr_vstack = np.vstack((arr1, arr2)) # Empilement vertical
arr_hstack = np.hstack((arr1, arr2)) # Empilement horizontal
print("Empilement vertical :n", arr_vstack)
print("nEmpilement horizontal :n", arr_hstack)
List Comprehension et création de tableau
Pour construire des tableaux à partir d’itérables, la list comprehension combinée avec numpy.array
peut être concise et efficace.
import numpy as np
arr = np.array([i**2 for i in range(10)])
print(arr)
Choisir la bonne méthode
La méthode optimale dépend de votre cas d’utilisation spécifique :
- Préallocation : Idéal pour remplir séquentiellement un grand tableau.
concatenate
: Idéal pour joindre plusieurs tableaux existants.vstack
/hstack
: Pratique pour l’empilement vertical ou horizontal.- List comprehension +
numpy.array
: Concis pour créer des tableaux à partir d’itérables.
Conclusion
Bien que les tableaux NumPy ne prennent pas en charge l’ajout direct comme les listes Python, des alternatives efficaces existent. Comprendre ces méthodes est crucial pour écrire du code numérique performant. Privilégiez la préallocation autant que possible pour une efficacité optimale.