Я сожалею заранее, если это дублированный вопрос, я искал эту информацию, но все еще не мог ее найти.
Можно ли организовать массив numpy (или список python), используя очень эффективные индексы N самых больших элементов в порядке убывания?
Например, массив:
a = array([4, 1, 0, 8, 5, 2])
Индексы крупнейших элементов в порядке убывания дадут (учитывая N = 6, все элементы включены):
8 → 3
5 → 4
4 → 0
2 → 5
1 → 1
0 → 2
result = [3, 4, 0, 5, 1, 2]
Я знаю, как сделать это, используя несколько глупый подход (например, сортировку массива и поиск каждого из N номеров для своих индексов), но мне было интересно, есть ли какая-либо эффективная библиотека, например, узкое место или heapq или, возможно, pythonic подход, чтобы сделать это очень быстро. Я должен применять его в нескольких массивах с элементами 300 тыс., Поэтому проблема в производительности.
Спасибо заранее!
UPDATE
Я прочитал ответы и решил использовать их с использованием 300k случайных целых чисел, вот результаты:
решение 1: sorted(range(len(a)), key=lambda i:a[i])
время: 230 мс
решение 2: heapq.nlargest(len(a), zip(a, itertools.count()))
время: 396 мс
решение 3: heapq.nlargest(len(a), enumerate(a), key=operator.itemgetter(1))
время: 864 мс
решение 4: def f(a,N): return np.argsort(a)[::-1][:N] (N = len(a))
время: 104 мс
Большое спасибо за быстрые и очень хорошие ответы!