<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def getClusterPrototypes(self, numClusters, numPrototypes=1):
 """ 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. """

    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)