NumPy Tutorials

Effizientes Hinzufügen von Elementen zu NumPy-Arrays

Spread the love

Effizientes Hinzufügen von Elementen zu NumPy-Arrays

NumPy, ein Eckpfeiler des wissenschaftlichen Rechenökosystems von Python, bietet leistungsstarke N-dimensionale Array-Objekte. Diese Arrays bieten erhebliche Leistungsvorteile gegenüber Standard-Python-Listen, aber das direkte Anhängen von Elementen ist nicht so einfach oder effizient, wie man erwarten könnte. Dieses Tutorial untersucht effiziente Alternativen zum Anhängen an NumPy-Arrays.

Inhaltsverzeichnis

Einführung

NumPy-Arrays sind für effiziente numerische Operationen konzipiert. Ihre feste Größe trägt wesentlich zu dieser Effizienz bei. Im Gegensatz zu Python-Listen, die dynamisch ihre Größe ändern, führt der Versuch, Elemente direkt an ein NumPy-Array mit Methoden ähnlich der append()-Methode einer Liste anzuhängen, zu einem Fehler. Dies liegt daran, dass die Größenänderung die Erstellung eines völlig neuen Arrays, das Kopieren der alten Daten und das anschließende Hinzufügen des neuen Elements erfordert – eine rechenintensive Operation, insbesondere bei großen Arrays und häufigen Anhängungen.

Warum direktes Anhängen vermeiden?

Das direkte Anhängen an NumPy-Arrays ist ineffizient, da es wiederholte Array-Erstellung und Datenkopie beinhaltet. Dies führt zu einer erheblichen Leistungseinbuße, insbesondere bei großen Datensätzen oder häufigen Anhängevorgängen. Der Overhead der Speicherzuweisung und Datenübertragung überwiegt bei weitem den Vorteil des einfachen Anhängens.

Vorabzuweisung

Der effizienteste Ansatz ist oft, ein Array der gewünschten endgültigen Größe vorab zuzuweisen und es dann iterativ zu füllen. Dies vermeidet die wiederholte Array-Erstellung, die beim wiederholten Anhängen entsteht.


import numpy as np

size = 1000
arr = np.empty(size, dtype=int)  # Datentyp für bessere Performance angeben

for i in range(size):
    arr[i] = i * 2  #Mit Werten füllen

print(arr)

Verkettung

numpy.concatenate verbindet effizient bestehende Arrays entlang einer bestehenden Achse. Dies ist ideal, wenn Sie mehrere Arrays kombinieren möchten.


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)  # Ausgabe: [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 für vertikale Verkettung, axis=1 für horizontale
print(arr_combined_2d)

Vertikales und horizontales Stapeln

Für das vertikale (zeilenweise) und horizontale (spaltenweise) Stapeln von Arrays bieten numpy.vstack und numpy.hstack praktische Funktionen.


import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

arr_vstack = np.vstack((arr1, arr2))  # Vertikales Stapeln
arr_hstack = np.hstack((arr1, arr2))  # Horizontales Stapeln

print("Vertikales Stapeln:n", arr_vstack)
print("nHorizontales Stapeln:n", arr_hstack)

List Comprehension und Array-Erstellung

Zum Erstellen von Arrays aus Iterables kann List Comprehension in Kombination mit numpy.array prägnant und effizient sein.


import numpy as np

arr = np.array([i**2 for i in range(10)])
print(arr)

Die richtige Methode auswählen

Die optimale Methode hängt von Ihrem konkreten Anwendungsfall ab:

  • Vorabzuweisung: Am besten zum sequenziellen Füllen eines großen Arrays.
  • concatenate: Ideal zum Verbinden mehrerer bestehender Arrays.
  • vstack/hstack: Praktisch zum vertikalen oder horizontalen Stapeln.
  • List Comprehension + numpy.array: Prägnant zum Erstellen von Arrays aus Iterables.

Fazit

Während NumPy-Arrays kein direktes Anhängen wie Python-Listen unterstützen, gibt es effiziente Alternativen. Das Verständnis dieser Methoden ist entscheidend für das Schreiben von performantem numerischem Code. Priorisieren Sie die Vorabzuweisung, wann immer möglich, für optimale Effizienz.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert