Скажем, у меня есть следующий массив:
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, и так далее.
Я действительно не понимаю вашего ожидаемого результата. Как это связано с вашим вкладом? Почему 3 без изменений?
@Bazingaa самое большое значение 7 должно стать самым низким, 1, второе по величине должно стать вторым по величине, 2 и т. д.
почему бы выбор противоположного знака чисел не решил эту проблему.
В этом случае, если вы меняете масштаб, 3 должно стать 5






Если входные значения уникальны:
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]
Если я правильно понял, вы хотите присвоить каждому значению в отсортированном порядке значение в той же позиции в обратном отсортированном порядке.
Хотите объяснить / добавить объяснение своей логики в код?
Вот простой способ:
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 имеет функцию побитового обращения здесь
У них есть логичный способ сделать это ...
x*-1. кроме того, я не понимаю, как это может быть хорошо