J'essaie de mettre en œuvre un algorithme de clustering k-medoids en Python/NumPy. En tant qu'élément de cet algo, je dois calculer la somme des distances entre les objets et leurs «médoïdes» (représentants de grappes).NumPy: vectoriser la somme des distances à un ensemble de points
J'ai: une matrice de distance sur cinq points
n_samples = 5
D = np.array([[ 0. , 3.04959014, 4.74341649, 3.72424489, 6.70298441],
[ 3.04959014, 0. , 5.38516481, 4.52216762, 6.16846821],
[ 4.74341649, 5.38516481, 0. , 1.02469508, 8.23711114],
[ 3.72424489, 4.52216762, 1.02469508, 0. , 7.69025357],
[ 6.70298441, 6.16846821, 8.23711114, 7.69025357, 0. ]])
un ensemble de medoids initial
medoids = np.array([0, 3])
et les appartenances groupe
cl = np.array([0, 0, 1, 1, 0])
je peux calculer la somme nécessaire à l'aide
>>> np.sum(D[i, medoids[cl[i]]] for i in xrange(n_samples))
10.777269622938899
mais cela utilise une boucle Python. Est-ce que je manque une sorte d'idiome vectorisé pour calculer cette somme?