шалость несоответствие в сортировке? Лексорт против уникальности - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 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, где я могу изменить приоритет упорядочения?

1 Ответ

0 голосов
/ 05 ноября 2018

Я нашел одно возможное решение проблемы здесь: https://stackoverflow.com/a/43825409/10552040

s[np.lexsort(np.flipud(s.transpose()))]
...