Frage

Ich bin neu in Numpy und ich möchte Dich fragen, wie euklidischen Abstand zwischen den Punkten in einem Vektor gespeichert berechnen.

Nehmen wir an, dass wir eine numpy.array jede Zeile ist ein Vektor und eine einzige numpy.array. Ich würde gerne wissen, ob es möglich ist, den euklidischen Abstand zwischen allen Punkten und diesen einzigen Punkt und speichert sie in einer numpy.array zu berechnen.

Hier ist eine Schnittstelle:

points #2d list of row-vectors
singlePoint #one row-vector

listOfDistances= procedure( points,singlePoint)

Können wir so etwas? Oder ist es möglich, einen Befehl zu haben, den einzigen Punkt als eine Liste von anderen Punkten zu haben, und am Ende bekommen wir eine Matrix von Entfernungen?

Danke

War es hilfreich?

Lösung

Während Sie vectorize verwenden können, @ Karl Ansatz eher langsam mit numpy Arrays sein wird.

Je einfacher Ansatz ist es, nur np.hypot(*(points - single_point).T) zu tun. (Die transponieren geht davon aus, dass die Punkte ein N x 2 Array, sondern als ein 2 × N. Wenn es 2 × N ist, brauchen Sie nicht die .T.

Dies ist jedoch ein bisschen unleserlich, so dass Sie es schreiben, wie dies mehr explictly aus (einige Konserven Beispieldaten mit ...):

import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))

dist = (points - single_point)**2
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist)

Andere Tipps

Um den Abstand erhalten Sie die Norm Methode des linalg Modul in numpy verwenden können:

np.linalg.norm(x - y)
import numpy as np
def distance(v1, v2):
    return np.sqrt(np.sum((v1 - v2) ** 2))    

eine Funktion auf jedes Element eines numpy Array anwenden zu können, versuchen Sie numpy.vectorize .

die tatsächliche Berechnung zu tun, müssen wir die Quadratwurzel aus der Summe der Quadrate der Differenzen (puh!) Zwischen Paaren von Koordinaten in den beiden Vektoren.

Wir können zip verwenden, um die Koordinaten zu paaren, und sum mit einem Verständnis der Ergebnisse zusammenzufassen. Das sieht aus wie:

sum((x - y) ** 2 for (x, y) in zip(singlePoint, pointFromArray)) ** 0.5
import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))   
distance = euclid_dist(single_point,points)

def euclid_dist(t1, t2):
    return np.sqrt(((t1-t2)**2).sum(axis = 1))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top