def map_circloc2regionid_multiple(locs, centerlocs, radis):
    "Map the each point to the correspondent circular region."
    idxs_dis = distribute_tasks(locs.shape[0], 50000)
    regions_id = [[] for i in range(locs.shape[0])]
    for k in range(len(idxs_dis)):
        logi = cdist(locs[idxs_dis[k][0]:idxs_dis[k][1]], centerlocs) < radis
        aux = np.where(logi)
        for j in range(len(aux[0])):
            regions_id[aux[0][j]].append(aux[1][j])
    return regions_id
def map_circloc2regionid(locs, centerlocs, radis, multiple=False):
    "Map each point to the correspondent circular region."
    ## 0. If multiple regions assignation it is allowed
    if multiple:
        regions_id = map_circloc2regionid_multiple(locs, centerlocs, radis)
        return regions_id
    ## 1. Computation of indices
    # Fraction of work
    idxs_dis = distribute_tasks(locs.shape[0], 50000)
    regions_id = np.zeros(locs.shape[0])
    for k in range(len(idxs_dis)):
        # Computation of proportion in the radis
        dists = cdist(locs[idxs_dis[k][0]:idxs_dis[k][1]], centerlocs)
        prop = (dists - radis) / radis
        idxs = np.argmin(prop, axis=1)
        boolean = prop[range(idxs.shape[0]), idxs] > 0
        # Assignation of the indices
        regions_id[idxs_dis[k][0]:idxs_dis[k][1]] = idxs
        regions_id[idxs_dis[k][0]:idxs_dis[k][1]][boolean] = -1

    regions_id = regions_id.astype(int)

    return regions_id