从另一个答案开始,NumPy添加了numpy.partition
和numpy.argpartition
函数进行部分排序,使您可以及时执行此O(arr.size)
操作,或者O(arr.size+n*log(n))
如果您需要按排序顺序排列的元素。
numpy.partition(arr, n)
返回一个数组的大小arr
,其中n
第i个元素是这将是什么,如果该阵列被分选。所有较小的元素都在该元素之前,而所有较大的元素都在之后。
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]
一维的情况要简单得多:
# Unordered:
indices = numpy.argpartition(arr, n-1)[:n]
# Extra code if you need the indices in order:
min_elements = arr[indices]
min_elements_order = numpy.argsort(min_elements)
ordered_indices = indices[min_elements_order]