📅  最后修改于: 2023-12-03 15:04:33.588000             🧑  作者: Mango
在numpy中,有一个非常实用的函数,名为numpy.partition(),它可以将一个数组分为两部分或多部分。通常情况下,我们会使用numpy.argsort()来获取排序后数组的索引,并使用切片来划分数组。 但是,如果想要在不获取排序索引的情况下划分数组,numpy.partition()则是一个非常好的选择。
numpy.partition(arr, kth, axis=-1, kind='introselect', order=None)
参数说明:
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的一个很好的工具,用于快速且简单地将数组分成两个或多个部分,可以通过指定算法和排序方式来进行控制。