У меня есть numpy.ndarray s n-мерных координат. Давайте придерживаться n = 2 и обозначим через s [i] [0] координату x, а s [i] [1] координату y.
Например:
s = np.asarray([[-1. , 0. ], [ 0. , 0. ], [ 0. , 0.5 ], [ 0. , 0. ], [-1. , 0.25]])
print(s)
[[-1. 0. ]
[ 0. 0. ]
[ 0. 0.5 ]
[ 0. 0. ]
[-1. 0.25]]
Я хочу иметь возможность отсортировать эти точки лексикографически, что можно сделать с помощью np.lexsort следующим образом.
print(s[np.lexsort(s.transpose())])
[[-1. 0. ]
[ 0. 0. ]
[ 0. 0. ]
[-1. 0.25]
[ 0. 0.5 ]]
np.lexsort всегда сортирует от последней к первой записи, т.е.
(x_1,y_1) <= (x_2,y_2) <=> y_1 < y_2 OR y_1 == y_2 and x_1 <= x_2.
Нет возможности изменить порядок на следующий, верно?
(x_1,y_1) <= (x_2,y_2) <=> x_1 < x_2 OR x_1 == x_2 and y_1 <= y_2
С другой стороны, есть функция numpy.unique, которая возвращает отсортированные уникальные элементы массива:
print(np.unique(s,axis=0))
[[-1. 0. ]
[-1. 0.25]
[ 0. 0. ]
[ 0. 0.5 ]]
Теперь элементы сортируются от первого до последнего индекса. И у np.unique нет возможности изменить порядок.
Мне нужны обе функции, и мне нужен последовательный порядок. Есть ли «уникальная» функция или функция lexsort, где я могу изменить приоритет упорядочения?