Я удивлен, что этот конкретный вопрос не задавали раньше, но я действительно не нашел его ни в 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
принимает параметры для изменения знака сравнений в операции сортировки, чтобы получить вещи в обратном порядке.
temp[::-1].sort()
узнать, что сортировка производится в обратном порядке ?? Я читаю это так: переверните исходный массив, а затем отсортируйте его (в порядке возрастания). Почему изменение исходного массива (поступающего в случайном порядке) и последующая его сортировка в порядке возрастания возвращает массив в обратном порядке?[::-1]
просто указывает numpy перебирать массив в обратном направлении, а не фактически переупорядочивать массив. Поэтому, когда происходит сортировка на месте, она фактически сортирует в возрастающем порядке и перемещает биты, но оставляет нетронутой часть обратной итерации.a=np.array((...))
идиомойa[::-1]
ничего не меняет, это просто новый взгляд на те же данные, а точнее зеркальное представление. Этот методa[::-1].sort()
работает с зеркальным изображением , подразумевая, что приsort
перемещении влево меньшего элемента в его зеркальном изображении, в действительности он перемещает его вправо в реальном блоке памятиa
массива. Зеркальное отображение сортируется в порядке возрастания, реальные данные сортируются в порядке убывания. Попробуйте дома самостоятельно, с разными монетами и зеркалом!np.sort(temp,order='descending')
вместо того, чтобы требовать такого рода хаковисточник
axis
нужно знать, к чему этоnp.sort
было применено.np.sort(temp)[::-1]
что он помещаетnan
s в конце массива, а не в начале. Хорошо это или плохо - вопросДля коротких массивов я предлагаю использовать
np.argsort()
поиск индексов отсортированного массива negatived, что немного быстрее, чем перестановка отсортированного массива:источник
a[np.argsort(-a)]
вероятно, лучший подход к любым другим на этой странице. Не нужно думать о развороте на -1 шаг и на один знак минус меньше.К сожалению, когда у вас сложный массив, он
np.sort(temp)[::-1]
работает правильно. Два других упомянутых здесь метода неэффективны.источник
Будьте осторожны с габаритами.
Позволять
Полный реверс
flip
изменено1.15
, требуются предыдущие версии . Решение .1.14
axis
pip install --upgrade numpy
Первое измерение перевернуто
Второе измерение перевернуто
Тестирование
Тестирование на массиве 100 × 10 × 10 1000 раз.
В основном это происходит из-за переиндексации, а не
argsort
.источник
Здравствуйте, я искал решение для обратной сортировки двумерного массива numpy, и я не смог найти ничего, что работало бы, но я думаю, что наткнулся на решение, которое я загружаю на случай, если кто-то окажется в той же лодке.
np.sort сортирует по возрастанию, что вам не подходит, но команда fliplr переворачивает строки слева направо! Кажется, работает!
Надеюсь, это поможет вам!
Я думаю, это похоже на предложение о -np.sort (-a) выше, но я отложил это из-за комментария, что это не всегда работает. Возможно, мое решение не всегда будет работать, но я протестировал его с несколькими массивами и, похоже, все в порядке.
источник
Вы можете сначала отсортировать массив (по умолчанию по возрастанию), а затем применить np.flip () ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html )
FYI Он также работает с объектами datetime.
Пример:
источник
x = np.array([2,3,np.nan,1,0])
тогдаnp.flip(np.sort(x))
подход дает [nan 3. 2. 1. 0.], а-np.sort(-x)
подход дает [3. 2. 1. 0. nan].Вот быстрый трюк
источник
я предлагаю использовать это ...
например:
Тогда ваш результат:
источник
np.arange(20-0.5, 10-0.5, -0.5)
. Но это другая история , и может быть, из - за худшую читаемость, спорно. Входной массив вообще не сортируется