Рассчитайте евклидово расстояние с нуля между 3 массивами - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть 3 огромных числовых массива, и я хочу построить функцию, которая вычисляет евклидово расстояние попарно от точек одного массива до точек второго и третьего массива.

Ради простотыпредположим, у меня есть эти 3 массива:

a = np.array([[1.64,0.001,1.56,0.1],
              [1.656,1.21,0.32,0.0001],
              [1.0002,0.0003,1.111,0.0003],
              [0.223,0.6665,1.2221,1.659]])

b = np.array([[1.64,0.001,1.56,0.1],
              [1.656,1.21,0.32,0.0001],
              [1.0002,0.0003,1.111,0.0003],
              [0.223,0.6665,1.2221,1.659]])

c = np.array([[1.64,0.001,1.56,0.1],
              [1.656,1.21,0.32,0.0001],
              [1.0002,0.0003,1.111,0.0003],
              [0.223,0.6665,1.2221,1.659]])

Я пробовал это:

def correlation(x, y, t):
    from math import sqrt

    for a,b, in zip(x,y,t):
        distance = sqrt((x[a]-x[b])**2 + (y[a]-y[b])**2 + (t[a]-t[b])**2 )
    return distance

Но этот код выдает ошибку: ValueError: too many values to unpack (expected 2)

Как я могу правильнореализовать эту функцию с помощью numpy или base python?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Сначала мы определяем функцию, которая вычисляет расстояние между каждой парой строк двух матриц.

def pairwise_distance(f, s, keepdims=False):
    return np.sqrt(np.sum((f-s)**2, axis=1, keepdims=keepdims))

Во-вторых, мы определяем функцию, которая вычисляет все возможные расстояния между каждой парой строк одной и той же матрицы:

def all_distances(c):
    res = np.empty(shape=c.shape, dtype=float)
    for row in np.arange(c.shape[0]):
        res[row, :] = pairweis_distance(c[row], c) #using numpy broadcasting
    return res

Теперь мы закончили

row_distances = all_distances(a) #row wise distances of the matrix a
column_distances = all_distances(a) #column wise distances of the same matrix
row_distances[0,2] #distance between first and third row
row_distances[1,3] #distance between second and fourth row
0 голосов
/ 25 февраля 2019

Начните с двух массивов:

a = np.array([[1.64,0.001,1.56,0.1],
              [1.656,1.21,0.32,0.0001],
              [1.0002,0.0003,1.111,0.0003],
              [0.223,0.6665,1.2221,1.659]])

b = np.array([[1.64,0.001,1.56,0.1],
              [1.656,1.21,0.32,0.0001],
              [1.0002,0.0003,1.111,0.0003],
              [0.223,0.6665,1.2221,1.659]])

Чтобы рассчитать расстояние между элементами этих массивов, вы можете сделать:

pairwise_dist_between_a_and_b=[(each**2+b[index]**2)**0.5 for index, each in enumerate(a)]

Таким образом вы получите pairwise_dist_between_a_and_b:

[array([2.31931024e+00, 1.41421356e-03, 2.20617316e+00, 1.41421356e-01]),
 array([2.34193766e+00, 1.71119841e+00, 4.52548340e-01, 1.41421356e-04]),
 array([1.41449641e+00, 4.24264069e-04, 1.57119127e+00, 4.24264069e-04]),
 array([0.31536962, 0.94257334, 1.72831039, 2.3461803 ])]

Вы можете использовать одно и то же понимание списка для первого и третьего массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...