@cache_readonly
def group_info(self) -> tuple[(npt.NDArray[np.intp], npt.NDArray[np.intp], int)]:
    ngroups = self.ngroups
    obs_group_ids = np.arange(ngroups, dtype=np.intp)
    rep = np.diff(np.r_[(0, self.bins)])
    rep = ensure_platform_int(rep)
    if (ngroups == len(self.bins)):
        comp_ids = np.repeat(np.arange(ngroups), rep)
    else:
        comp_ids = np.repeat(np.r_[((- 1), np.arange(ngroups))], rep)
    return (ensure_platform_int(comp_ids), obs_group_ids, ngroups)
@cache_readonly
def group_info(self) -> tuple[(npt.NDArray[np.intp], npt.NDArray[np.intp], int)]:
    ngroups = self.ngroups
    obs_group_ids = np.arange(ngroups, dtype=np.intp)
    rep = np.diff(np.r_[(0, self.bins)])
    rep = ensure_platform_int(rep)
    if (ngroups == len(self.bins)):
        comp_ids = np.repeat(np.arange(ngroups), rep)
    else:
        comp_ids = np.repeat(np.r_[((- 1), np.arange(ngroups))], rep)
    return (ensure_platform_int(comp_ids), obs_group_ids, ngroups)