def _build_k_prototypes(self, nprot, data):
        # K-Means / K-Medoids algorithm
        # should return a N-length array with he indices of the chosen data
        grouper = K_Means()
        grouper._centroid_mode = "index"
        grouper.fit(data,
                    nprot,
                    iters=300,
                    mode="cuda",
                    cuda_mem='manual',
                    tol=1e-4,
                    max_iters=300)
        centroids = grouper.centroids

        nclusters = centroids.shape[0]

        # TODO - very inefficient
        k_labels = np.zeros(nclusters, dtype=np.int32)

        for k in xrange(nclusters):
            dist = data - centroids[k]
            dist = dist**2
            dist = dist.sum(axis=1)

            k_labels[k] = dist.argmin()
        return k_labels