Euklidische Abstände zwischen den Punkten
-
21-09-2019 - |
Frage
Ich habe eine Reihe von Punkten in numpy:
points = rand(dim, n_points)
Und ich möchte:
- berechnen alle L2-Norm (euklidischen Abstand) zwischen einem bestimmten Punkt und allen anderen Punkten
- berechnen alle paarweise Distanzen.
und vorzugsweise alle numpy und nicht für die. Wie kann man das tun?
Lösung
Wenn Sie bereit sind SciPy zu verwenden, das scipy.spatial.distance
Modul (die Funktionen cdist
und / oder pdist
) genau das tun, was Sie wollen, mit allen in der C getan Looping Sie können es mit zu Rundfunk, aber es gibt einige zusätzliche Speicher Overhead.
Andere Tipps
Dies könnte helfen mit dem zweiten Teil:
import numpy as np
from numpy import *
p=rand(3,4) # this is column-wise so each vector has length 3
sqrt(sum((p[:,np.newaxis,:]-p[:,:,np.newaxis])**2 ,axis=0) )
das gibt
array([[ 0. , 0.37355868, 0.64896708, 1.14974483],
[ 0.37355868, 0. , 0.6277216 , 1.19625254],
[ 0.64896708, 0.6277216 , 0. , 0.77465192],
[ 1.14974483, 1.19625254, 0.77465192, 0. ]])
, wenn p ist
array([[ 0.46193242, 0.11934744, 0.3836483 , 0.84897951],
[ 0.19102709, 0.33050367, 0.36382587, 0.96880535],
[ 0.84963349, 0.79740414, 0.22901247, 0.09652746]])
und Sie einen der Einträge überprüfen können über
sqrt(sum ((p[:,0]-p[:,2] )**2 ))
0.64896708223796884
Der Trick ist newaxis zu setzen und dann tun sendet.
Viel Glück!
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow