HOWTO · NumPy

Euklidischen Abstand berechnen in Python

Dieses Tutorial zeigt, wie man den euklidischen Abstand in Python berechnet

Auf dieser Seite

Für zwei NumPy-Arrays, die Punkte mit derselben Anzahl von Koordinaten darstellen, berechnen Sie den euklidischen Abstand mit np.linalg.norm(point_a - point_b). Die Subtraktion erzeugt die Koordinatendifferenzen, und die L2-Norm des Vektors fasst sie zu einem nichtnegativen Abstand zusammen.

Die Formel für den euklidischen Abstand verstehen

Für die Punkte (a=(a_1,\ldots,a_n)) und (b=(b_1,\ldots,b_n)) ist der euklidische Abstand die Quadratwurzel aus der Summe der quadrierten Koordinatendifferenzen:

Formel für den euklidischen Abstand: die Quadratwurzel aus der Summe der quadrierten Koordinatendifferenzen.

In NumPy drückt np.linalg.norm(a - b) diese Definition direkt aus. Bei einem eindimensionalen Differenzarray ohne ord-Argument berechnet np.linalg.norm dessen 2-Norm. Beide Eingaben müssen Punkte in kompatiblen Dimensionen beschreiben, damit die Subtraktion die beabsichtigte Bedeutung hat.

Eingabekoordinaten vorbereiten

Koordinatenpositionen müssen dieselben Achsen in derselben Reihenfolge beschreiben: Vergleichen Sie die erste Koordinate eines Punkts mit der ersten des anderen usw. Stellen Sie einen Punkt als eindimensionales Array mit der Form (coordinates,) dar. Zwei Arrays mit der Form (3,) stehen beispielsweise für zwei Punkte im selben dreidimensionalen Koordinatensystem; sie stehen nicht für drei unabhängige Abstände.

Tupel und Listen lassen sich vor der Subtraktion mit np.asarray(values, dtype=float) umwandeln. Der Gleitkommatyp akzeptiert ganzzahlige oder dezimale Koordinaten und verhindert einen Überlauf vorzeichenloser Ganzzahlen, wenn eine Koordinate kleiner als ihr Gegenstück ist. Sind die Eingaben bereits geeignete NumPy-Gleitkommaarrays, ist die Umwandlung unnötig. Vermeiden Sie es, beliebige mehrdimensionale Daten nur zum Anpassen der Formen abzuflachen, denn das kann einen Fehler der Eingabestruktur verbergen statt ihn zu beheben.

Die folgenden Beispiele wurden mit Python 3.14.7, NumPy 2.5.3 und SciPy 1.18.1 ausgeführt. Die gezeigten APIs sind etablierte Schnittstellen; eine Anwendung sollte dennoch Versionen verwenden, die zu ihrer unterstützten Python-Umgebung passen. SciPy ist optional, solange weder die SciPy-Methode noch Werkzeuge für paarweise Abstände verwendet werden.

Den Abstand zwischen zwei Punkten berechnen

Das folgende geprüfte Beispiel vergleicht den empfohlenen Normausdruck mit der expliziten Formel, einer Punktproduktformulierung, dem Standardbibliotheksaufruf math.dist und Scipys scipy.spatial.distance.euclidean. Alle fünf Berechnungen liefern für dieses Punktepaar dasselbe Ergebnis.

"""Verify equivalent Euclidean-distance APIs for one pair of points."""

import math

import numpy as np
from scipy.spatial import distance

point_a = np.array([1.0, 2.0, 3.0])
point_b = np.array([4.0, 5.0, 6.0])

print(f"np.linalg.norm: {np.linalg.norm(point_a - point_b)}")
print(f"formula: {np.sqrt(np.sum((point_a - point_b) ** 2))}")
delta = point_a - point_b
print(f"dot product: {np.sqrt(np.dot(delta, delta))}")
print(f"math.dist: {math.dist(point_a, point_b)}")
print(f"distance.euclidean: {distance.euclidean(point_a, point_b)}")
np.linalg.norm: 5.196152422706632
formula: 5.196152422706632
dot product: 5.196152422706632
math.dist: 5.196152422706632
distance.euclidean: 5.196152422706632

Die explizite Formel verwendet gedanklich elementweises Quadrieren mit NumPy, anschließend eine Summe und eine Quadratwurzel. Die Exponentenschreibweise im Beispiel hält die vollständige Berechnung in einem Ausdruck. Die Punktproduktvariante berechnet dieselbe Quadratsumme, weil np.dot(delta, delta) entsprechende Differenzen multipliziert und addiert.

Verwenden Sie np.linalg.norm, wenn die Punkte bereits Arrays sind oder Teil einer größeren NumPy-Berechnung werden. Es kommuniziert die Vektoroperation klar, ohne die Reduktion auszuschreiben.

Zeilenweise Abstände mit axis=1 berechnen

Bei mehreren Punkten, die als Zeilen eines zweidimensionalen Arrays gespeichert sind, subtrahieren Sie einen Referenzpunkt und setzen axis=1. NumPy überträgt das Referenzarray auf die Zeilen, während axis=1 np.linalg.norm anweist, eine Norm pro Zeile statt einer Norm für die gesamte Matrix zurückzugeben.

"""Verify row-wise distances from several points to one reference point."""

import numpy as np

points = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
reference = np.array([1.0, 2.0, 3.0])

print(np.linalg.norm(points - reference, axis=1))
[0.         5.19615242]

Die erste Zeile entspricht der Referenz, ihr Abstand ist also null. Das zweite Ergebnis ist der Abstand aus dem Beispiel mit einem Punktepaar. Dieses Muster deckt Eins-zu-viele-Abstände ab; für alle paarweisen Abstände zwischen zwei Sammlungen sollten Sie eine spezialisierte Routine wie scipy.spatial.distance.cdist verwenden, statt ohne Blick auf den Speicherbedarf ein großes Broadcast-Zwischenarray zu erzeugen.

Zwischen NumPy, math.dist und SciPy wählen

Die beste Methode hängt vom umgebenden Code ab, nicht von einer allgemeinen Geschwindigkeitsbehauptung:

  • Verwenden Sie np.linalg.norm(a - b) für NumPy-Arrays, vektorisierte Abläufe und zeilenweise Berechnungen mit axis.
  • Verwenden Sie math.dist(a, b) für ein Paar gewöhnlicher Python-Koordinateniterables, wenn NumPy ansonsten nicht benötigt wird.
  • Verwenden Sie scipy.spatial.distance.euclidean(a, b), wenn SciPy bereits eine Abhängigkeit ist oder die Berechnung zu Scipys weitergehenden Distanzwerkzeugen gehört.
  • Verwenden Sie die explizite Quadrat-Summen-Formel oder das Punktprodukt zum Lehren, Prüfen oder Anpassen der zugrunde liegenden Berechnung. Sie machen das Ergebnis nicht euklidischer als der Normausdruck.

Das Umwandeln von Listen mit np.asarray(..., dtype=float) ist vor der NumPy-Subtraktion hilfreich, weil Python-Listen keine elementweise Subtraktion unterstützen. math.dist akzeptiert gleichlange Koordinateniterables direkt, während die NumPy- und SciPy-Optionen ihre jeweiligen installierten Pakete benötigen.

Inkompatible Formen und numerische Datentypen behandeln

Zwei einzelne Punkte müssen dieselbe Anzahl von Koordinaten haben. Inkompatible eindimensionale Formen können nicht gemeinsam übertragen werden; deshalb löst NumPy einen ValueError aus, bevor es einen Abstand berechnen kann.

"""Capture the diagnostic for points with incompatible dimensions."""

import numpy as np

point_a = np.array([1.0, 2.0])
point_b = np.array([3.0, 4.0, 5.0])

try:
    np.linalg.norm(point_a - point_b)
except ValueError as error:
    print(f"ValueError: {error}".rstrip())
ValueError: operands could not be broadcast together with shapes (2,) (3,)

Prüfen Sie die Formen vor der Subtraktion, wenn Dimensionen aus Benutzereingaben oder externen Daten stammen. Für zeilenweise Abstände ist ein Punktearray mit der Form (rows, coordinates) mit einer Referenz der Form (coordinates,) kompatibel; eine andere Form kann unbeabsichtigt übertragen werden oder fehlschlagen.

Wandeln Sie außerdem vor der Subtraktion vorzeichenlose ganzzahlige Koordinaten in einen vorzeichenbehafteten oder Gleitkommatyp um. Vorzeichenlose Subtraktion kann überlaufen, statt eine negative Koordinatendifferenz darzustellen, wodurch die anschließende Norm falsch wird. Gleitkommaarrays wie in den Beispielen vermeiden dieses Problem und unterstützen nichtganzzahlige Koordinaten.

Für ein Paar gleichdimensionaler NumPy-Punkte ist np.linalg.norm(point_a - point_b) die knappe Standardwahl. Ergänzen Sie axis=1 für zeilenweise Abstände und prüfen Sie Formen und Datentypen, wenn die Eingabestruktur nicht bereits garantiert ist.