HOWTO · NumPy
NumPy-Einheitsvektor
Es gibt zwei Hauptmethoden, die verwendet werden können, um ein NumPy-Array in Python auf einen Einheitsvektor zu normalisieren, die Funktion numpy.linalg.norm() und den selbstdefinierten Ansatz.
Auf dieser Seite
Einen von null verschiedenen NumPy-Vektor normalisierst du, indem du ihn durch seine euklidische Norm teilst: unit_vector = vector / np.linalg.norm(vector). Für [3.0, 4.0] ergibt das [0.6, 0.8].
Einheitsvektor definieren
Um ein eindimensionales NumPy-Array in einen Einheitsvektor umzuwandeln, teile jede Komponente durch die euklidische Norm des Vektors:
u = v / ||v||
Ein Einheitsvektor hat den Betrag eins. Durch die Division durch die Norm ändert sich die Länge des Vektors, seine Richtung bleibt jedoch erhalten. Positive skalare Vielfache eines Vektors ergeben dieselbe normierte Richtung; eine Multiplikation mit einem negativen Skalar kehrt die Richtung um. Das ist nützlich, wenn eine Berechnung von der Richtung und nicht von der ursprünglichen Größe abhängen soll.
Mit numpy.linalg.norm() normalisieren
Die Funktion numpy.linalg.norm() von NumPy berechnet bei einem eindimensionalen Array standardmäßig die euklidische Norm. Das folgende Beispiel erstellt ein Array, teilt es durch seine Norm und gibt die normierten Komponenten aus.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import numpy as np
vector = np.array([3.0, 4.0])
unit_vector = vector / np.linalg.norm(vector)
print(unit_vector)
[0.6 0.8]
Für diese Eingabe beträgt die Norm 5; daher wird jede Komponente durch 5 geteilt. Verwende Gleitkommazahlen als Eingabe, wenn das Ergebnis Nachkommastellen enthalten soll. Das Ergebnis hat dieselbe eindimensionale Form wie die Eingabe.
Die Norm manuell berechnen
Für einen Vektor v mit den Komponenten v[i] ist die euklidische Norm die Quadratwurzel aus der Summe der quadrierten Komponenten. In NumPy lautet diese Berechnung sqrt(sum(v ** 2)); teilt man den Vektor durch diesen Wert, erhält man dieselbe Normalisierungsformel. Bei dieser Variante sind die einzelnen mathematischen Schritte sichtbar. Das kann beim Lernen oder beim Anpassen der Berechnung hilfreich sein.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import numpy as np
vector = np.array([3.0, 4.0])
norm = np.sqrt(np.sum(vector ** 2))
unit_vector = vector / norm
print(unit_vector)
Die hier gezeigte manuelle Formel gilt für einen gewöhnlichen eindimensionalen reellen Vektor. Verwende bei komplexwertigen Arrays oder anderen Normdefinitionen die passende Operation von NumPy, statt davon auszugehen, dass das Quadrieren der Komponenten den gewünschten Betrag ergibt.
Nullvektoren und Eingabeform behandeln
Ein Vektor, dessen Komponenten alle null sind, hat die Norm null. Eine Division durch diese Norm ist nicht definiert. Da ein Nullvektor keine Richtung hat, lässt er sich auch nicht in einen Einheitsvektor umwandeln. Lege für diese Eingabe ausdrücklich fest, wie dein Code damit umgehen soll: Eine wiederverwendbare Funktion kann beispielsweise einen ValueError auslösen; alternativ kannst du den Fall im aufrufenden Code vor der Normalisierung behandeln. Den ursprünglichen Nullvektor zurückzugeben, vermeidet zwar die Division, macht ihn aber nicht zu einem Einheitsvektor.
Die obigen Beispiele verwenden jeweils einen Vektor mit der Form (n,). Wenn ein Array mehrere Vektoren enthält, bestimmen seine Form und die an die Normberechnung übergebene Achse, was normalisiert wird. Ein zweidimensionales Array kann Vektoren beispielsweise als Zeilen oder Spalten enthalten. Wähle die Achse, die dem jeweiligen Vektor entspricht, und teile dann jede Zeile oder Spalte mithilfe von Broadcasting durch ihre zugehörige Norm. Normalisiere nicht die gesamte Matrix, als wäre sie ein einzelner Vektor, es sei denn, genau das ist die beabsichtigte mathematische Operation.
Ergebnis prüfen und Methode auswählen
Prüfe bei einer Eingabe ungleich null, ob die Norm des normalisierten Vektors ungefähr eins beträgt; berücksichtige dabei Rundungsfehler bei Gleitkommazahlen. Für den eindimensionalen Fall kannst du im Code np.isclose(np.linalg.norm(unit_vector), 1.0) verwenden. Ein exakter Gleichheitsvergleich eignet sich für die meisten Gleitkommaberechnungen nicht, da die gerundeten Komponenten eine Norm ergeben können, die sehr nahe bei eins liegt, aber nicht genau eins ist.
Verwende numpy.linalg.norm() für den üblichen Arbeitsablauf mit NumPy: Die Absicht der Berechnung wird dadurch klar ausgedrückt, und für andere Aufgaben lässt sich das gewünschte Normverhalten auswählen. Die manuelle Summe-der-Quadrate-Formel eignet sich, wenn du die euklidische Berechnung erklären möchtest oder ihre einzelnen Schritte benötigst. Beide Ansätze setzen eine von null verschiedene Norm voraus; keiner von beiden macht aus dem Nullvektor einen Einheitsvektor. Wenn du mit mehreren Vektoren arbeitest, halte die Eingabeform und die Achse für die Normalisierung ausdrücklich fest.