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