ranges = np.vstack((a, b))
ranges.sort(0)
nonoverlapping = (ranges[1:, (0)] - ranges[:-1, (1)] > 1).nonzero()[0]
starts = np.hstack(([0], nonoverlapping + 1))
ends = np.hstack((nonoverlapping, [-1]))
result = np.vstack((ranges[starts, 0], ranges[ends, 1])).T
numpy: как объединить массивы? (чтобы получить объединение нескольких диапазонов)