Расстояние Scipy: вычисление между каждым сопоставлением индекса наблюдений двух 2D массивов - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь вычислить метрики расстояния между двумя двумерными массивами, скажем, A и B (n 'строк' x 6 'столбцов' каждый), используя функции scipy.spatial.distance. Я хотел бы рассчитать эти расстояния между каждой парой наблюдений , которые соответствуют одному и тому же индексу (например, между A [i ,:] и B [i ,:])) эффективно (т.е. без зацикливания по индексу массива ).

Я знаю, что scipy.spatial.distance.cdist достигает этого быстро, но между всеми парами наблюдений, включая те, которые не совпадают по индексу. Поэтому я ищу кванталент, но только для наблюдений с сопоставлением индексов.

Вот простой пример для вычисления евклидова расстояния:

import numpy as np
from scipy.spatial import distance

a = np.array([[1, 5, 6, 7, 8, 7, 9], [5, 7, 8, 6, 4, 1, 2]])
b = np.array([[9, 8, 9, 5, 7, 1, 2], [1, 5, 5, 7, 2, 1, 1]])

print(distance.cdist(a, b, 'euclidean')) # Compute the euclidean distance between each pair

for i in range(0, len(a), 1):
    print(distance.euclidean(a[i,:], b[i,:])) # Do the job but too long

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 13 апреля 2020

Вы можете использовать numpy .linalg.norm , указав параметр оси:

import numpy as np

a = np.array([[1, 5, 6, 7, 8, 7, 9], [5, 7, 8, 6, 4, 1, 2]])
b = np.array([[9, 8, 9, 5, 7, 1, 2], [1, 5, 5, 7, 2, 1, 1]])

print(np.linalg.norm(a-b, axis=1))
[13.11487705  5.91607978]
...