Инвертировать масштаб массива - PullRequest
0 голосов
/ 26 декабря 2018

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

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 ]

0 голосов
/ 26 декабря 2018

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

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]
0 голосов
/ 26 декабря 2018

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

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])
0 голосов
/ 26 декабря 2018

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

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]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...