我尝试理解该函数,但输出看起来很奇怪。
array = np.array([9, 2, 7, 4, 6, 3, 8, 1, 5])
print(np.partition(array, kth=0))
这是我由于某种原因得到的输出:
[1 2 7 4 6 3 8 9 5]
预计获得:
[X X X X X X X X 9]
我错过了什么?
根据 numpy.partition 文档中的描述,
[1 2 7 4 6 3 8 9 5]
是 kth=0
输入数组的正确分区:
创建数组的副本,并重新排列其元素,使第 k 个位置的元素的值位于其在排序数组中的位置。所有小于第 k 个元素的元素都移动到该元素之前,所有等于或大于该元素的元素都移动到它的后面。两个分区中元素的顺序未定义。
我认为混乱在于对kth的模糊描述。这是分区操作之后的索引,而不是之前的索引。因此,在您的示例中, kth=0
并不是指输入数组 (9) 索引 0 处的值,它指的是相同值的排序数组的索引 0 处的任何值,在本例中为 1 .
[1 X X X X X X X X]
的安排均有效。
分区逻辑:
应用 np.partition(array, kth=0) 后,输出数组将具有以下属性:
索引 0 处的元素将是最小的元素(在本例中为 1)。 索引 0 之前的所有元素(本例中没有)都将小于或等于索引 0 处的元素。 索引 0 之后的所有元素都将大于或等于索引 0 处的元素。 数组可能未完全排序,但相对于第 k 个索引的元素将采用正确的分区顺序。 结果:
np.partition(array, kth=0) 的结果将是:
[1 2 7 4 6 3 8 9 5]
总结 kth=0 指定您要对数组进行分区,以使最小元素(在本例中为 1)位于第一个位置。 结果的第 0 个索引处将有 1,所有其他元素将被重新排列,使它们大于或等于 1。但是,不保证其余元素按任何特定顺序排列。