Хорошо, я недавно обнаружил, что команда scipy.spatial.distance.cdist
очень быстро решает ПОЛНУЮ матрицу расстояний между двумя векторными массивами для источника и назначения. см .: Как можно вычислить евклидово расстояние с помощью numpy? Я хотел попытаться продублировать этот выигрыш в производительности достигается при решении расстояния между двумя массивами одинакового размера. Расстояние между двумя ОДНИМИ векторами довольно просто вычислить, как показано в предыдущей ссылке. Мы можем взять векторы:
import numpy as np
A=np.random.normal(size=(3))
B=np.random.normal(size=(3))
а затем используйте ´numpy.linalg.norm´, где
np.linalg.norm(A-B)
эквивалентно
temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)
что хорошо работает, однако, когда я хочу знать расстояние между двумя наборами векторов, где my_distance = distance_between( A[i], B[i] ) for all i
второе решение работает отлично. В этом, как и ожидалось:
A=np.random.normal(size=(3,42))
B=np.random.normal(size=(3,42))
temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)
дает мне набор из 42 расстояний между i
-м элементом A
и i
-м элементом B
. В то время как функция norm
правильно вычисляет норму для всей матрицы, давая мне одно значение, которое я не ищу. Я хочу сохранить поведение с 42 расстояниями, надеюсь, с почти такой же скоростью, как я получаю от cdist
для решения полных матриц. Итак, вопрос в том, как наиболее эффективно использовать python и numpy / scipy для вычисления i
расстояний между данными с формой (n,i)
?
Спасибо, Слоан