从另一个答案开始,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 pre if you need the indices in order:min_elements = arr[indices]min_elements_order = numpy.argsort(min_elements)ordered_indices = indices[min_elements_order]



