numpy 分区如何工作

Posted

技术标签:

【中文标题】numpy 分区如何工作【英文标题】:how numpy partition work 【发布时间】:2017-05-19 22:35:38 【问题描述】:

我想弄清楚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])

我希望在分区后数组将拆分为小于一的元素、一和大于一的元素。 但是第二个零放在最后一个数组位置,这不是分区后的正确位置。

【问题讨论】:

查看文档docs.scipy.org/doc/numpy-dev/reference/generated/… 是的,我有。根据文档,“元素的第 k 个值将处于其最终排序位置,所有较小的元素将移到它之前,所有相等或更大的元素都将移到它后面。”。对非唯一数组的行为只字不提。我发现唯一数组上的分区工作正常。 【参考方案1】:

documentation 说:

创建一个数组的副本,其中的元素以这样的方式重新排列 第 k 个位置的元素的值在它应该在的位置 一个排序数组。所有小于第 k 个元素的元素都被移动到前面 这个元素和所有相等或更大的元素都移到它后面。的排序 两个分区中的元素是未定义的。

在您给出的示例中,您选择了排序列表的第 2 个元素(从零开始),即 -1,如果数组已排序,它似乎位于正确的位置。

【讨论】:

这可能是“清楚”,但很容易将原始数组中的kth位置与结果中的kth位置混淆。 是的,这是真的。也许这部分可以在文档中得到更多强调。【参考方案2】:

docs 谈论“排序数组”。

np.partition 首先对提供的数组中的元素进行排序。在这种情况下,原始数组是:

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 作为arr_sorted2 位置的元素,而不是arr。该元素被正确选择为-1

【讨论】:

除了它并没有真正对数组进行排序。第 k 个元素之前和之后的元素可以(并且确实)具有任意顺序。

以上是关于numpy 分区如何工作的主要内容,如果未能解决你的问题,请参考以下文章

NumPy 多维数组迭代是如何工作的? (有和没有 nditer)

在进行矩阵工作时如何理解循环和额外 numpy 维度之间的权衡?

numpy C API 中的 import_array 如何工作?

BigQuery 中的分区如何工作?

如何使Recovery分区正常工作

如果消费者更多是分区,kafka 消费者如何工作