Эффективная сортировка массива numpy в порядке убывания?



Я удивлен, что этот конкретный вопрос не был задан раньше, но я действительно не нашел его ни на SO, ни на документации np.sort.



скажем, у меня есть случайный массив numpy, содержащий целые числа, например:



> temp = np.random.randint(1,10, 10)    
> temp
array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4])


если я сортирую его, я получаю порядок возрастания по умолчанию:



> np.sort(temp)
array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7])


но я хочу, чтобы решение было отсортировано в спуск порядок.



теперь я знаю, что всегда могу сделать:



reverse_order = np.sort(temp)[::-1]


но это последнее заявление эффективное? Разве он не создает копию в порядке возрастания, а затем отменяет эту копию, чтобы получить результат в обратном порядке? Если это действительно так, есть ли эффективная альтернатива? Это не похоже на np.sort принимает параметры для изменения знака сравнения в операции сортировки, чтобы получить вещи в обратном порядке.

832   4  

4 ответов:

temp[::-1].sort() сортирует массив на месте, тогда как np.sort(temp)[::-1] создает новый массив.

In [25]: temp = np.random.randint(1,10, 10)

In [26]: temp
Out[26]: array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4])

In [27]: id(temp)
Out[27]: 139962713524944

In [28]: temp[::-1].sort()

In [29]: temp
Out[29]: array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2])

In [30]: id(temp)
Out[30]: 139962713524944
>>> a=np.array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4])

>>> np.sort(a)
array([2, 2, 4, 4, 4, 4, 5, 6, 7, 8])

>>> -np.sort(-a)
array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2])

для коротких массивов я предлагаю использовать np.argsort() находя индексы отсортированного отрицательного массива, что немного быстрее, чем обращение отсортированного массива:

In [37]: temp = np.random.randint(1,10, 10)

In [38]: %timeit np.sort(temp)[::-1]
100000 loops, best of 3: 4.65 µs per loop

In [39]: %timeit temp[np.argsort(-temp)]
100000 loops, best of 3: 3.91 µs per loop

к сожалению, когда у вас есть сложный набор, только np.sort(temp)[::-1] работает правильно. Два других метода, упомянутых здесь, не являются эффективными.

Comments

    Ничего не найдено.