Frage

Ich habe eine Reihe von Punkten in numpy:

points = rand(dim, n_points)

Und ich möchte:

  1. berechnen alle L2-Norm (euklidischen Abstand) zwischen einem bestimmten Punkt und allen anderen Punkten
  2. berechnen alle paarweise Distanzen.

und vorzugsweise alle numpy und nicht für die. Wie kann man das tun?

War es hilfreich?

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
scroll top