HOWTO · NumPy

So ordnen Sie eine Funktion in NumPy zu

Wenden Sie eine Python-Funktion mit numpy.vectorize() oder map() und einem Lambda auf jeden Wert in einem NumPy-Array an. Erfahren Sie, wie die beiden Ansätze funktionieren und wann welcher zu verwenden ist.

Auf dieser Seite

Um eine skalare Python-Funktion auf jeden Wert eines NumPy-Arrays anzuwenden, können Sie die Funktion mit numpy.vectorize() umschließen oder Pythons map() mit einem lambda verwenden und das Ergebnis in ein Array umwandeln. Beide Ansätze eignen sich, wenn Sie skalare Logik wiederverwenden möchten. Sie sind jedoch nicht mit den nativen Array-Operationen von NumPy gleichzusetzen, die im Allgemeinen die bessere Wahl sind, wenn eine passende Operation verfügbar ist.

Mit numpy.vectorize() eine Funktion elementweise anwenden

numpy.vectorize() passt eine Funktion, die jeweils einen einzelnen Wert verarbeitet, so an, dass Sie sie mit einem Array aufrufen können. Die umschlossene Funktion wird auf jedes Element angewendet und gibt ein Array mit den Ergebnissen zurück. Das ist praktisch, wenn vorhandene Python-Logik für einzelne Werte geschrieben wurde und Sie sie mit Array-Daten verwenden möchten.

Im Beispiel wird eine skalare Funktion umschlossen, die ihren Eingabewert quadriert. Anschließend wird sie auf fünf Ganzzahlen angewendet:

import numpy as np

def square(value):
    return value ** 2

values = np.array([1, 2, 3, 4, 5])
square_each = np.vectorize(square)
result = square_each(values)

print(result)

Hier bleibt square eine gewöhnliche Python-Funktion; np.vectorize() stellt eine Array-orientierte Aufrufschnittstelle bereit. Es handelt sich um einen Komfort-Wrapper und keine Leistungsoptimierung: Die Funktion wird dadurch nicht zu einer kompilierten NumPy-Operation. Für Rechenoperationen, die NumPy bereits unterstützt, ist ein Ausdruck wie values ** 2 einfacher und verwendet direkt die Array-Operation von NumPy. Verwenden Sie numpy.vectorize(), wenn sich skalare Logik damit klarer ausdrücken oder leichter wiederverwenden lässt.

Mit map() und einer lambda-Funktion arbeiten

Pythons integriertes map() ruft eine Funktion für jedes Element eines Iterables einmal auf. Ein lambda ist eine kompakte Möglichkeit, eine kleine Funktion direkt an Ort und Stelle zu definieren. Bei einem NumPy-Array als Eingabe erzeugt map() einen Iterator mit den zugeordneten Werten. Umschließen Sie diesen Iterator mit list() und übergeben Sie die resultierende Liste an np.array(), um ein Array zu erstellen.

In diesem Beispiel quadriert ein lambda dieselben Werte. Anschließend werden die zugeordneten Werte in ein NumPy-Array umgewandelt:

import numpy as np

values = np.array([1, 2, 3, 4, 5])
mapped_values = map(lambda value: value ** 2, values)
result = np.array(list(mapped_values))

print(result)

Das lambda erhält jeden Array-Wert einzeln, und map() liefert die jeweils berechneten Quadrate der Reihe nach. Wenn Sie den Iterator in eine Liste umwandeln, wird er vollständig durchlaufen; np.array() erstellt dann aus diesen Werten ein Array. Dieser Ansatz eignet sich für eine kurze skalare Operation, die direkt beim Aufruf von map() stehen soll. Definieren Sie bei längerer Logik eine benannte Funktion, damit der Code leichter lesbar und wartbar ist, und übergeben Sie diese Funktion anstelle des lambda an map().

Verwenden Sie numpy.vectorize(), wenn Sie einer vorhandenen skalaren Funktion eine Array-förmige Aufrufschnittstelle geben möchten. map() mit einem lambda eignet sich für eine kleine, direkt eingebettete Umwandlung, besonders wenn der resultierende Iterator vor der Umwandlung nützlich ist. Bei Operationen wie dem Quadrieren aller Werte ist der direkte NumPy-Ausdruck values ** 2 vorzuziehen, sofern er die gewünschte Berechnung ausdrückt. Diese Ansätze beschreiben verschiedene Möglichkeiten, Python-Logik anzuwenden; daraus folgt nicht, dass eine der beiden Mapping-Varianten schneller ist.