Рандомизировать вывод numpy.argsort в случае связей - PullRequest
0 голосов
/ 25 июня 2019

У меня есть пустой массив с некоторыми элементами, такими же, как у других, т.е. есть связи, и я применяю np.argsort, чтобы найти индексы, которые будут сортировать массив:

In [29]: x = [1, 2, 1, 1, 5, 2]

In [30]: np.argsort(x)
Out[30]: array([0, 2, 3, 1, 5, 4])

In [31]: np.argsort(x)
Out[31]: array([0, 2, 3, 1, 5, 4])

Как можно увидеть здесь, результаты, которые мы получаем при запуске argsort два раза, идентичны.Тем не менее, array([2, 3, 0, 5, 1, 4]) также является полностью допустимым выводом, потому что некоторые элементы в исходном массиве равны.Могу ли я заставить argsort возвращать мне такие «рандомизированные» выходные данные, когда в моем массиве есть связи?Если нет, то какой обходной путь, потому что я не хочу смещать мой выбор самых низких значений в массиве, когда я выбираю их.

1 Ответ

3 голосов
/ 25 июня 2019

Один трюк - добавить равномерный шум в диапазоне [0,1), а затем выполнить сортировку.Добавление такого шума заставляет сортировать только в пределах соответствующих бинов и дает рандомизированные индексы сортировки, ограниченные этими бинами -

(x+np.random.rand(len(x))).argsort()
...