Could not find a shorter way, than this one import numpy as np from scipy.cluster.vq import vq X = np.array([[ 2., 4., 2.], [ 1., 3., 1.], [ 3., 4., 2.], [ 2., 3., 2.], [ 1., 5., 5.]]) codebook = np.array([[ 1. , 3. , 1. ], [ 2.33, 3.67, 2. ], [ 1. , 5. , 5. ]]) partition, euc_distance_to_centroids = vq(X, codebook) TSS = np.sum((X-X.mean(0))**2) SSW = np.sum(euc_distance_to_centroids**2) SSB = TSS - SSW # The 'direct' way B = [] c = X.mean(0) for i in range(partition.max()+1): ci = X[partition == i].mean(0) B.append(np.bincount(partition)[i]*np.sum((ci - c)**2)) SSB_ = np.sum(B) print(TSS, SSW, SSB, SSB_) prints 14.8 1.3334 13.4666 13.4666666667