Найти позиции элементов в отсортированном массиве - PullRequest
0 голосов
/ 23 ноября 2018

Предположим, у меня есть какой-нибудь массив numpy (все элементы уникальны), который я хочу отсортировать в порядке убывания.Мне нужно выяснить, какие позиции элементы исходного массива займут в отсортированном массиве.

Пример.

In1: [1, 2, 3] # Input

Out1: [2, 1, 0] # Expected output

In2: [1, -2, 2] # Input

Out2: [1, 2, 0] # Expected output

Я пробовал это:

def find_positions(A):
    A = np.array(A)
    A_sorted = np.sort(A)[::-1]
    return np.argwhere(A[:, None] == A_sorted[None, :])[:, 1]

Но этоне работает, когда входной массив очень большой (len> 100000).Что я сделал не так и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Взгляните на функцию numpy.argsort(...):

Возвращает индексы, которые будут сортировать массив.

Выполнить косвенную сортировку по заданной оси, используя алгоритм, заданныйдоброе ключевое слово.Он возвращает массив индексов той же формы, что и данные индексации по заданной оси в отсортированном порядке.

Здесь является ссылкой из документации, а следующеепростой пример:

import numpy
arr = numpy.random.rand(100000)
indexes = numpy.argsort(arr)

массив indexes будет содержать все индексы в порядке сортировки массива arr

0 голосов
/ 23 ноября 2018

Подход № 1

Мы могли бы использовать двойной аргумент -

np.argsort(a)[::-1].argsort() # a is input array/list

Подход № 2

Мы могли быиспользовать один аргумент argsort, а затем присвоение массива -

# https://stackoverflow.com/a/41242285/ @Andras Deak
def argsort_unique(idx):
    n = idx.size
    sidx = np.empty(n,dtype=int)
    sidx[idx] = np.arange(n)
    return sidx

out = argsort_unique(np.argsort(a)[::-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...