Если вы можете добавить зависимость scipy, то это уже реализовано в scipy.spatial.distance.cdist . В противном случае мы можем использовать numpy .broadcasting и numpy .linalg.norm :
Реализация Scipy
from scipy.spatial import distance
distance.cdist(X, C, 'euclidean')
Numpy Реализация
import numpy as np
np.linalg.norm(X[:,None,:] - C, axis=2)
Производительность
P = 100_000
K = 10_00
D = 3
X = np.random.randint(0,10, (P,D))
C = np.random.randint(0,10, (K,D))
%timeit distance.cdist(X, C, 'euclidean')
1.06 s ± 57 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit np.linalg.norm(X[:,None,:] - C, axis=2)
15 s ± 2.18 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
Мы видим, что для больших размеров X
и C
Реализация scipy намного быстрее.