Метод np.argpartition
возвращает только k самых больших индексов, выполняет локальную сортировку и работает быстрее, чем np.argsort
(выполнение полной сортировки), когда массив довольно большой.Но возвращаемые индексы НЕ в порядке возрастания / убывания .Скажем, на примере:
Мы можем видеть, что если вы хотите строгий порядок старших индексов в порядке возрастания, np.argpartition
не вернет то, чтовы хотите.
Помимо выполнения сортировки вручную после np.argpartition, мое решение заключается в использовании PyTorch, torch.topk
, инструмента для построения нейронных сетей, предоставляющего API-интерфейсы, подобные NumPy, споддержка как CPU, так и GPU.Это так же быстро, как NumPy с MKL, и предлагает повышение GPU, если вам нужны большие матричные / векторные вычисления.
Строгий индекс индексов k для восходящих и нисходящих верхних значений будет:
Обратите внимание, что torch.topk
принимает тензор резака и возвращает как верхние k-значения, так и верхние k-индексы типа torch.Tensor
.Как и в случае с np, torch.topk также принимает аргумент оси, так что вы можете обрабатывать многомерные массивы / тензоры.