Инвертировать масштаб массива

Скажем, у меня есть следующий массив:

x = np.array([3,7,1,2,6])

Как проще всего получить массив с его масштабом, скажем наоборот? Таким образом, минимальное значение станет максимальным, максимальное станет минимальным, и так далее для остальных значений.

Ожидаемая мощность:

array[3,1,7,6,2]

Чтобы уточнить, что я хочу получить, скажем, моя исходная последовательность:

y = sorted(x)
#[1, 2, 3, 6, 7]

Итак, массив отсортирован. Если бы это было так, я бы хотел массив, перевернутый, поэтому [7, 6, 3, 2, 1]. Я хочу добиться этого с помощью моих текущих данных.

Следовательно, там, где у меня было самое низкое значение, 1 теперь является 7, второй по величине значением, 2 теперь является 6, и так далее.

У них есть логичный способ сделать это ... x*-1. кроме того, я не понимаю, как это может быть хорошо

d_kennetz 26.12.2018 20:41

Я действительно не понимаю вашего ожидаемого результата. Как это связано с вашим вкладом? Почему 3 без изменений?

Sheldore 26.12.2018 20:43

@Bazingaa самое большое значение 7 должно стать самым низким, 1, второе по величине должно стать вторым по величине, 2 и т. д.

yatu 26.12.2018 20:44

почему бы выбор противоположного знака чисел не решил эту проблему.

d_kennetz 26.12.2018 20:45

В этом случае, если вы меняете масштаб, 3 должно стать 5

Sheldore 26.12.2018 20:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
5
547
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если входные значения уникальны:

import numpy as np

x = np.array([3, 7, 1, 2, 6])

s = sorted(x)
lookup = {v: i for v, i in zip(s, reversed(s))}

result = np.array(list(map(lookup.get, x)))

print(result)

Вывод

[3 1 7 6 2]

Если я правильно понял, вы хотите присвоить каждому значению в отсортированном порядке значение в той же позиции в обратном отсортированном порядке.

Хотите объяснить / добавить объяснение своей логики в код?

Sheldore 26.12.2018 20:51
Ответ принят как подходящий

Вот простой способ:

np.sort(x)[::-1][np.argsort(np.argsort(x))]

Почему это работает: предположим, что ваш список уже отсортирован, тогда вам просто нужно отменить его. Поскольку список не отсортирован, мы можем сначала отсортировать его, затем отменить, а затем отменить сортировку.

Улучшение: нам действительно нужно вычислить argsort только один раз. Затем x можно отсортировать с помощью этого списка, и мы сможем вычислить обратную перестановку для argsort(x) без другой сортировки.

ax = np.argsort(x)
aax = np.zeros(len(ax),dtype='int')
aax[ax] = np.arange(len(ax),dtype='int')

x[ax[::-1]][aax]

вот моя первая мысль:

In [13]: xr=np.zeros_like(x)

In [14]: g=0

In [15]: f=np.unique(sorted(x))

In [16]: for b in f:
             g-=1
             #for repeated values:
             for y in np.where(x==b)[0]:
                 xr[y]=f[g]
    ...:     
In [17]: xr
Out[17]: array([3, 1, 7, 6, 2])

Вот как я инвертирую значение массива np (наибольшее значение -> наименьшее значение, наименьшее значение -> наибольшее) без сортировки.

np_arr_inv = np_arr * -1 + np_arr.max()

Мне нужно соблюдать порядок, так как это данные изображения.

FYI Numpy имеет функцию побитового обращения здесь

Другие вопросы по теме