Эффективная сортировка массива 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 принимает параметры для изменения знака сравнения в операции сортировки, чтобы получить вещи в обратном порядке.
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