📜  Python中的 numpy.partition()(1)

📅  最后修改于: 2023-12-03 15:04:33.588000             🧑  作者: Mango

Numpy Partition()

在numpy中,有一个非常实用的函数,名为numpy.partition(),它可以将一个数组分为两部分或多部分。通常情况下,我们会使用numpy.argsort()来获取排序后数组的索引,并使用切片来划分数组。 但是,如果想要在不获取排序索引的情况下划分数组,numpy.partition()则是一个非常好的选择。

Partition()的语法

numpy.partition(arr, kth, axis=-1, kind='introselect', order=None)

参数说明:

  • arr:输入的数组
  • kth:分割数组的索引,可以为整数或数组,如果为整数,则分割数组分为两部分,即前(kth+1)个元素和后面的元素;如果为数组,则会沿给定的轴在它们的位置上对数组进行划分,数组中的元素将按照给定的顺序排列。
  • axis:默认为-1,即沿着最后的轴进行操作,除非定制了 kth 或 sorter,否则应该保持默认。
  • kind:选择算法,即选择的分割算法类型。 可以取值是'introselect', 'heapsort', 'quicksort'。 默认是'introselect'。
  • order:数组元素按照什么顺序进行排序,包括'A', 'C', 'F',根据默认的内存布局排序,即按行('C')排序,行排序快于列排序,但可能会导致缓存未命中,'F'指按列排序,'A'指按照给定必要行处理最优。
算法介绍

numpy.partition()默认使用 introselect 算法,introselect是一种结合了 快速选择 和 堆排序 的快速排序 算法。 在一般情况下,(对于大多数正确优化的实现), Introselect 提供了比 普通快排 更好的效率。

代码实例
划分一维数组

下面的实例演示了将一维数组划分为两部分。 排序分割的索引 2 (表示位置3) 。 结果将在索引2处分割数组,产生具有最大三个元素的分隔符。

import numpy as np

arr = np.array([3, 4, 2, 1, 5, 6, 8, 7])

print('原数组:')
print(arr)

print('\n划分后的数组:')
print(np.partition(arr, 2))

原数组: [3 4 2 1 5 6 8 7]

划分后的数组: [2 1 3 4 5 6 8 7]

上述代码实际上是将原数组中索引为2的元素和前面的两个元素一起组成了一个新数组,而其余部分构成了另一个数组。

按多维数组划分

我们也可以按照多维数组来进行划分。 下面的实例将在列上对数组进行排序,使得每列最大的元素出现在每列的中间位置,比如在第二列的中间位置。

import numpy as np

arr = np.array([[3, 4, 2], 
                [1, 5, 6], 
                [8, 7, 9]])

print('原数组:')
print(arr)

print('\n划分后的数组:')
print(np.partition(arr, 1, axis=0))

原数组: [[3 4 2] [1 5 6] [8 7 9]]

划分后的数组: [[1 4 2] [3 5 6] [8 7 9]]

我们可以看到,数组的划分会使得每列最大值出现在第二行,其他数据位于第一行和第二行之间。

使用不同的算法和排序方式

我们也可以在调用partition()函数的时候,指定算法,以及排序方式:

import numpy as np

arr = np.array([3, 4, 2, 1, 5, 6, 8, 7])

print('原数组:')
print(arr)

print('\n使用heapsort算法进行划分:')
print(np.partition(arr, 2, kind='heapsort'))

print('\n使用quicksort算法进行划分:')
print(np.partition(arr, 2, kind='quicksort'))

print('\n按F顺序排序数组并按给定顺序排序:')
print(np.partition(arr, 2, order='F'))

原数组: [3 4 2 1 5 6 8 7]

使用heapsort算法进行划分: [2 1 3 4 5 6 8 7]

使用quicksort算法进行划分: [2 1 3 4 5 6 7 8]

按F顺序排序数组并按给定顺序排序: [2 1 3 4 5 6 7 8]

我们通过三个不同的partition()函数调用演示了不同的算法和排序方式,并使用了传递给kth参数的整数,以及order参数来按不同的顺序组织数据。

总结

numpy.partition()是numpy的一个很好的工具,用于快速且简单地将数组分成两个或多个部分,可以通过指定算法和排序方式来进行控制。