for a, b in itertools.groupby(enumerate(s), lambda x_y: x_y[1] - x_y[0]):
    b = list(b)
yield b[0][1], b[-1][1]

def intersect(*args):
    """ Converts any number of numpy arrays containing start, end pairs 
        into a set of indexes """
s = set()
for start, end in np.vstack(args):
    s = s | set(range(start, end + 1))
return s
a = np.array([[5, 7], [12, 18], [20, 29]])
b = np.array([[2, 4], [8, 11], [33, 35]])
result = np.array(list(ranges(intersect(a, b))))
numpy: как объединить массивы? (чтобы получить объединение нескольких диапазонов)