Ответ 1
Со времени другого ответа NumPy добавил numpy.partition
и numpy.argpartition
для частичной сортировки, что позволяет сделать это в O(arr.size)
time или O(arr.size+n*log(n))
, если вам нужны элементы в отсортированном порядке.
numpy.partition(arr, n)
возвращает массив размером arr
, где элемент n
th - это то, что было бы, если массив был отсортирован. Все меньшие элементы появляются перед этим элементом, и все более крупные элементы появляются позже.
numpy.argpartition
соответствует numpy.partition
, поскольку numpy.argsort
соответствует numpy.sort
.
Здесь вы можете использовать эти функции для поиска индексов минимальных элементов n
arr
:
flat_indices = numpy.argpartition(arr.ravel(), n-1)[:n]
row_indices, col_indices = numpy.unravel_index(flat_indices, arr.shape)
И если вам нужны индексы по порядку, то row_indices[0]
- это строка минимального элемента, а не только один из минимальных элементов n
:
min_elements = arr[row_indices, col_indices]
min_elements_order = numpy.argsort(min_elements)
row_indices, col_indices = row_indices[min_elements_order], col_indices[min_elements_order]