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 i
th Element von A
zum i
th 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 № 1Ich 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