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))

3voto

Gennady Nikitin Punkte 51

Berechnen Sie den euklidischen Abstand für den mehrdimensionalen Raum:

 import math

 x = [1, 2, 6] 
 y = [-2, 3, 2]

 dist = math.sqrt(sum([(xi-yi)**2 for xi,yi in zip(x, y)]))
 5.0990195135927845

3voto

Jonas De Schouwer Punkte 642
import math

dist = math.hypot(math.hypot(xa-xb, ya-yb), za-zb)

2voto

Ankur Nadda Punkte 21
import numpy as np
from scipy.spatial import distance
input_arr = np.array([[0,3,0],[2,0,0],[0,1,3],[0,1,2],[-1,0,1],[1,1,1]]) 
test_case = np.array([0,0,0])
dst=[]
for i in range(0,6):
    temp = distance.euclidean(test_case,input_arr[i])
    dst.append(temp)
print(dst)

2voto

Lucas Wiman Punkte 8235

Die anderen Antworten funktionieren für Fließkommazahlen, berechnen aber nicht korrekt den Abstand für Integer-D-Typen, bei denen es zu Über- und Unterläufen kommt. Beachten Sie, dass auch scipy.distance.euclidean hat dieses Problem:

>>> a1 = np.array([1], dtype='uint8')
>>> a2 = np.array([2], dtype='uint8')
>>> a1 - a2
array([255], dtype=uint8)
>>> np.linalg.norm(a1 - a2)
255.0
>>> from scipy.spatial import distance
>>> distance.euclidean(a1, a2)
255.0

Dies ist üblich, da viele Bildbibliotheken ein Bild als ndarray mit dtype="uint8" darstellen. Das heißt, wenn Sie ein Graustufenbild haben, das aus sehr dunkelgrauen Pixeln besteht (sagen wir, alle Pixel haben die Farbe #000001 ) und Sie diffundieren es gegen ein schwarzes Bild ( #000000 ), kann es zu folgenden Ergebnissen kommen x-y bestehend aus 255 in allen Zellen, was sich dadurch bemerkbar macht, dass die beiden Bilder sehr weit voneinander entfernt sind. Für Integer-Typen ohne Vorzeichen (z. B. uint8) können Sie den Abstand in Numpy sicher wie folgt berechnen:

np.linalg.norm(np.maximum(x, y) - np.minimum(x, y))

Bei vorzeichenbehafteten Integer-Typen können Sie zunächst in eine Fließkommazahl umwandeln:

np.linalg.norm(x.astype("float") - y.astype("float"))

Speziell für Bilddaten können Sie die Norm-Methode von opencv verwenden:

import cv2
cv2.norm(x, y, cv2.NORM_L2)

2voto

Uddhav P. Gautam Punkte 6634
import numpy as np
# any two python array as two points
a = [0, 0]
b = [3, 4]

Sie ändern zunächst die Liste in numpy array und dies tun: print(np.linalg.norm(np.array(a) - np.array(b))) . Zweite Methode direkt aus Python Liste als: print(np.linalg.norm(np.subtract(a,b)))

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