Я хотел бы добавить свои 2 цента, поскольку не все функции уже реализованы в numpy или scipy. В общем, вы можете использовать numpy широковещательную передачу для получения векторизованного решения. Для конкретного c случая евклидова расстояния здесь, как вы это делаете:
import numpy as np
# Define the arrays of coordinates
coords_a = np.random.random((20, 2))
coords_b = np.random.random((20, 2))
# Expand their dimensions
a = coords_a[:, None]
b = coords_b[None, None]
# Use broadcasting to compute pairwise difference
d = a-b
# Apply formula for euclidean distance
r = np.sqrt(np.sum(d**2, axis=-1))
С точки зрения производительности времени для этого c случай scipy.spatial.distance.cdist
намного быстрее, но не все функции доступны :
import numpy as np
from scipy.spatial.distance import cdist
a = np.random.random((10_000, 2))
b = np.random.random((10_000, 2))
euc_broadcast = lambda a,b: np.sqrt(np.sum(np.square(a[:, None]-b[None, :]), axis=-1))
%timeit euc_broadcast(a, b)
3.39 s ± 149 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit cdist(a, b)
603 ms ± 13.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)