ids = np.ravel_multi_index(a.astype(int), a.max(1).astype(int) + 1)
sidx = ids.argsort()
sorted_ids = ids[sidx]
out = np.split(sidx, np.nonzero(sorted_ids[1:] > sorted_ids[:-1])[0] + 1)
Как получить уникальные строки и их вхождения для 2D-массива?