code: def getClusterPrototypes(self, numClusters, numPrototypes=1):
      
      linkage = self.getLinkageMatrix()
      linkage[:, 2] -= linkage[:, 2].min()
  
      clusters = scipy.cluster.hierarchy.fcluster(
        linkage, numClusters, criterion="maxclust")
      prototypes = []
      clusterSizes = []
  
      for cluster_id in numpy.unique(clusters):
        ids = numpy.arange(len(clusters))[clusters == cluster_id]
        clusterSizes.append(len(ids))
        if len(ids) > numPrototypes:
          cluster_prototypes = HierarchicalClustering._getPrototypes(
            ids, self._overlaps, numPrototypes)
        else:
          cluster_prototypes = numpy.ones(numPrototypes) * -1
          cluster_prototypes[:len(ids)] = ids
        prototypes.append(cluster_prototypes)
  
      return numpy.vstack(prototypes).astype(int), numpy.array(clusterSizes)
docs: Create numClusters flat clusters and find approximately numPrototypes
      prototypes per flat cluster. Returns an array with each row containing the
      indices of the prototypes for a single flat cluster.
  
      @param numClusters (int) Number of flat clusters to return (approximate).
  
      @param numPrototypes (int) Number of prototypes to return per cluster.
  
      @returns (tuple of numpy.ndarray) The first element is an array with rows
          containing the indices of the prototypes for a single flat cluster.
          If a cluster has less than numPrototypes members, missing indices are
          filled in with -1. The second element is an array of number of elements
          in each cluster.