Знаковое ранжирование numpy элементов массива - PullRequest
0 голосов
/ 14 июля 2020

Для проекта программирования я пытаюсь реализовать метод обрезки и заполнения для количественной оценки систематической ошибки в метаанализе. Одним из шагов алгоритма является ранжирование абсолютных значений элементов вектора без потери знака, например, мне нужно что-то вроде этого:

a_before = np.array([1, 3, -3, -2, 5, 2.5, 6])
a_after = np.array([1, 4, -5, 2, 6, 3, 7])

До сих пор мне удавалось получить массив с абсолютные значения с использованием numpy.absolute, а затем ранжирование значений с использованием .argsort. Я не могу понять, как мне получить признаки изначально отрицательных значений для нового ранжированного массива. Вот скриншот для дальнейшей иллюстрации.

Ответы [ 2 ]

1 голос
/ 14 июля 2020
a_before = np.array([1, 4, -5, 2, 6, 3, 7])
a_after = a_before[np.argsort(np.abs(a_before))]

Результат вывода a_after:

array([ 1,  2,  3,  4, -5,  6,  7])
0 голосов
/ 14 июля 2020

Я думаю, это то, что вы хотите:

# use bigger numbers so that it's obvious that 'rank' 
# is distinct from the numerical values.
a = np.array([10, 30, -31, -20, 50, 25, 60])
isort = np.argsort(np.abs(a))
rank = np.argsort(isort)+1
signed_rank = rank * np.sign(a)

print(signed_rank)

Вывод:

[ 1  4 -5 -2  6  3  7]

Но я думаю, что в предложенном вами * 1008 отсутствует знак минус (-2) *; есть только одно отрицательное значение, тогда как на входе было два отрицательных значения.

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