自另一个答案以来,NumPy已添加了numpy.partition
和numpy.argpartition
函数用于部分排序。如果您需要排序后的元素,则可以在O(arr.size)
时间内完成,或者在O(arr.size+n*log(n))
时间内完成。
numpy.partition(arr, n)
返回一个大小与arr
相同的数组,其中第n
个元素是如果按顺序排列,则其可能的值。所有较小的元素都在该元素之前,而所有较大的元素都在之后。
numpy.argpartition
类似于numpy.argsort
和numpy.sort
之间的关系,它是对numpy.partition
的补充。
这是如何使用这些函数来查找二维数组arr
中最小的n
个元素的索引:
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]
一维情况简单得多:
indices = numpy.argpartition(arr, n-1)[:n]
min_elements = arr[indices]
min_elements_order = numpy.argsort(min_elements)
ordered_indices = indices[min_elements_order]