我想弄清楚
np.partition
函数是如何工作的。
例如,考虑
arr = np.array([5, 4, 1, 0, -1, -3, -4, 0])
如果我打电话给
np.partition(arr, kth=2)
,我会得到
np.array([-4, -3, -1, 0, 1, 4, 5, 0])
我预计,分区后,数组将分为元素小于一、一和元素大于一。 但第二个零被放置在最后一个数组位置,这不是分区后的正确位置。
文档说:
创建数组的副本,并重新排列其元素: 第 k 个位置的元素的值位于其应在的位置 一个排序的数组。所有小于第 k 个元素的元素都被移动到前面 该元素以及所有相等或更大的元素都移到它后面。的排序 两个分区中的元素未定义。
在您给出的示例中,您选择了排序列表的第 2 个元素(从零开始),即 -1,如果数组已排序,它似乎位于正确的位置。
文档谈论“排序数组”。
np.partition
首先对提供的数组中的元素进行排序(请参阅@norok2 的注释)。在这种情况下,原始数组是:
arr = [ 5, 4, 1, 0, -1, -3, -4, 0]
排序后,我们有:
arr_sorted = [-4 -3 -1 0 0 1 4 5]
因此,调用
np.partition(arr, kth=2)
实际上会将 kth
作为 2
的位置 arr_sorted
中的元素,而不是 arr
。该元素被正确选择为 -1
。
当我第一次阅读numpy.partition的官方文档时,我也按照OP的方式解释了它的含义。所以当我阅读文档中给出的例子时我很困惑,无法弄清楚我的理解错在哪里。我用谷歌搜索并找到了这里。
考虑到混淆频繁,因此应该对文档进行修订。我建议使用以下内容:
创建数组的副本,其元素按以下方式重新排列: 新数组的第 k 个元素位于其在排序数组中的位置。所有小于第 k 个元素的元素都移动到该元素之前,所有大于该元素的元素都移动到它的后面。两个分区中元素的顺序未定义。如果还有其他元素等于第 k 个元素,这些元素可能出现在第 k 个元素之前或之后。