788 Stimmen

Wie kann der euklidische Abstand mit NumPy berechnet werden?

Ich habe zwei Punkte in 3D:

(xa, ya, za)
(xb, yb, zb)

Und ich möchte die Entfernung berechnen:

dist = sqrt((xa-xb)^2 + (ya-yb)^2 + (za-zb)^2)

Was ist der beste Weg, dies mit NumPy, oder mit Python im Allgemeinen zu tun? Ich habe:

import numpy
a = numpy.array((xa ,ya, za))
b = numpy.array((xb, yb, zb))

2voto

Jonas De Schouwer Punkte 642

Sie können einfach die folgende Formel verwenden

distance = np.sqrt(np.sum(np.square(a-b)))

die eigentlich nichts anderes tut, als den Satz des Pythagoras zur Berechnung der Entfernung zu verwenden, indem sie die Quadrate von x, y und z addiert und das Ergebnis durch die Wurzel zieht.

1voto

johncasey Punkte 1026

Finde zunächst die Differenz zweier Matrizen. Wenden Sie dann die elementweise Multiplikation mit dem Befehl multiply von Numpy an. Danach wird die Summation der elementweise multiplizierten neuen Matrix ermittelt. Zum Schluss finden Sie die Quadratwurzel der Summation.

def findEuclideanDistance(a, b):
    euclidean_distance = a - b
    euclidean_distance = np.sum(np.multiply(euclidean_distance, euclidean_distance))
    euclidean_distance = np.sqrt(euclidean_distance)
    return euclidean_distance

1voto

eroot163pi Punkte 1603

Was ist der beste Weg, dies mit NumPy, oder mit Python im Allgemeinen zu tun? Ich habe:

Der beste Weg ist der sicherste und auch der schnellste

Ich würde die Verwendung von Hypot für zuverlässige Ergebnisse vorschlagen, da die Wahrscheinlichkeit eines Unter- oder Überlaufs sehr gering ist, verglichen mit dem Schreiben eines eigenen sqroot-Rechners

Sehen wir uns math.hypot, np.hypot und vanilla an np.sqrt(np.sum((np.array([i, j, k])) ** 2, axis=1))

i, j, k = 1e+200, 1e+200, 1e+200
math.hypot(i, j, k)
# 1.7320508075688773e+200

np.sqrt(np.sum((np.array([i, j, k])) ** 2))
# RuntimeWarning: overflow encountered in square

Geschwindigkeitstechnisch sieht math.hypot besser aus

%%timeit
math.hypot(i, j, k)
# 100 ns ± 1.05 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%%timeit
np.sqrt(np.sum((np.array([i, j, k])) ** 2))
# 6.41 µs ± 33.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Unterlauf

i, j = 1e-200, 1e-200
np.sqrt(i**2+j**2)
# 0.0

Überlauf

i, j = 1e+200, 1e+200
np.sqrt(i**2+j**2)
# inf

Kein Unterlauf

i, j = 1e-200, 1e-200
np.hypot(i, j)
# 1.414213562373095e-200

Kein Überlauf

i, j = 1e+200, 1e+200
np.hypot(i, j)
# 1.414213562373095e+200

Siehe

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X