Евклидовы расстояния между точками - PullRequest
3 голосов
/ 20 марта 2010

У меня есть массив точек в numpy:

points = rand(dim, n_points)

И я хочу:

  1. Рассчитать всю норму l2 (евклидово расстояние) между определенной точкой и всеми другими точками
  2. Рассчитать все попарные расстояния.

и, желательно, все тупые и не для. Как можно это сделать?

Ответы [ 2 ]

4 голосов
/ 20 марта 2010

Если вы хотите использовать SciPy, модуль scipy.spatial.distance (функции cdist и / или pdist) делает именно то, что вы хотите, со всеми циклами, выполненными в C. Вы можете сделать это с помощью трансляции тоже, но есть некоторые дополнительные затраты памяти.

1 голос
/ 20 марта 2010

Это может помочь со второй частью:

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) )

, что дает

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.        ]])

если р было

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]])

и вы можете проверить одну из записей через

sqrt(sum ((p[:,0]-p[:,2] )**2 ))
0.64896708223796884

Хитрость в том, чтобы поставить новую ось, а затем делать трансляцию.

Удачи!

...