Function to generate randomly sampled datasets with replacement. This is in the context of cells in the native dataset
    which are the rows of the matrix
    :param partitions: int designating the number of evenly spaced sample sizes to randomly select from the native dataset
    :param dataset: DataFrame of the native dataset compatible with the suffle function
    :param seed: pseudorandom seed, compatible with the replicate wrapper since it adds the index to the seed
    :return subOut: dictionary of the randomly sampled datasets, keys are the number of cells

def subsample(partitions,dataset,seed):
    '''
    Function to generate randomly sampled datasets with replacement. This is in the context of cells in the native dataset
    which are the rows of the matrix
    :param partitions: int designating the number of evenly spaced sample sizes to randomly select from the native dataset
    :param dataset: DataFrame of the native dataset compatible with the suffle function
    :param seed: pseudorandom seed, compatible with the replicate wrapper since it adds the index to the seed
    :return subOut: dictionary of the randomly sampled datasets, keys are the number of cells
    '''
    parts=np.arange(dataset.shape[0]/partitions,dataset.shape[0],dataset.shape[0]/partitions).astype(int)    
    subOut={}
    for i in range(parts.shape[0]):
        subOut["{0}cells".format(parts[i])]=np.asarray(shuffle(dataset,random_state=seed))[0:parts[i],:]
    return subOut