/ / Schnellste Methode zur Berechnung der euklidischen Entfernung zwischen zwei Vektorsätzen mit Hilfe von numpy oder scipy - numpy, scipy, python-2.x, euklidischer Abstand

Schnellster Weg zur Berechnung der euklidischen Distanz zwischen 2 Vektorsätzen mit Hilfe von numpy oder scipy - numpy, scipy, python-2.x, euklidische Distanz

OK, ich habe kürzlich entdeckt, dass die scipy.spatial.distance.cdist Der Befehl ist sehr schnell, um eine KOMPLETTE Abstandsmatrix zwischen zwei Vektorfeldern für Quelle und Ziel zu lösen. sehen: Wie kann der euklidische Abstand mit numpy berechnet werden? Ich wollte versuchen, diese Leistung zu duplizierenGewinne, wenn der Abstand zwischen zwei gleich großen Arrays gelöst wird. Der Abstand zwischen zwei SINGLE-Vektoren ist relativ einfach zu berechnen, wie im vorherigen Link gezeigt. Wir können Vektoren nehmen:

    import numpy as np
A=np.random.normal(size=(3))
B=np.random.normal(size=(3))

und dann'numpy.linalg.norm' wo

    np.linalg.norm(A-B)

ist äquivalent zu

    temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)

was aber gut funktioniert, wenn ich den Abstand zwischen zwei Vektorsätzen wissen möchte my_distance = distance_between( A[i], B[i] ) for all i Die zweite Lösung funktioniert perfekt. Wie erwartet:

    A=np.random.normal(size=(3,42))
B=np.random.normal(size=(3,42))
temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)

gibt mir eine Reihe von 42 Abständen zwischen den ith Element von A zum ith Element von B. Während die norm Funktion berechnet korrekt die Norm für dieDie ganze Matrix gibt mir einen einzigen Wert, der nicht das ist, wonach ich suche. Das Verhalten mit den 42 Distanzen ist das, was ich beibehalten möchte, hoffentlich mit fast so viel Geschwindigkeit, wie ich es bekomme cdist zum Lösen vollständiger Matrizen. Also die Frage ist, was ist der effizienteste Weg mit Python und numpy / scipy zu berechnen i Abstände zwischen Daten mit Form (n,i)?

Vielen Dank, Sloan

Antworten:

3 für die Antwort № 1

Ich denke, du hast den größten Teil des Falls schon selbst geknackt. Statt Ihrer letzten Zeile würde ich jedoch verwenden:

np.sqrt(np.sum(temp**2,0))

0 für die Antwort № 2

Hier sind die Zeitvergleiche für die beiden Methoden, die ich für am besten geeignet halte:

import timeit
In[19]:    timeit.timeit(stmt="np.linalg.norm(x-y,axis=0)", setup="import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))", number=1000000)
Out[19]:   15.132534857024439

In[20]:    timeit.timeit(stmt="np.sqrt(np.sum((x-y),axis=1))", setup="import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))", number=1000000)
Out[20]:   9.417887529009022

Ich bin nicht überrascht, dass die numpy Methode schneller arbeitet. Ich glaube, dass, wenn Python sich verbessert, viele dieser eingebauten Funktionen verbessert werden.

Tests wurden auf Anaconda Python Version 3.5.2 durchgeführt