NumPy Tutorials

Ajout efficace d’éléments aux tableaux NumPy

Spread the love

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

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *