numpy.
sort
返回数组的已排序副本。
要排序的数组。
要排序的轴。如果没有,则在排序前将数组展平。默认值是-1,它沿最后一个轴排序。
排序算法。默认值为“快速排序”。请注意,“stable”和“mergesort”都使用timsort或基数排序,一般来说,实际实现将随数据类型而变化。保留“mergesort”选项是为了向后兼容。
在 1.15.0. 版更改: 添加了“稳定”选项。
什么时候? a 是一个定义了字段的数组,此参数指定要比较第一个、第二个等的字段。可以将单个字段指定为字符串,但并非所有字段都需要指定,但未指定的字段仍将按它们在数据类型中出现的顺序使用,以断开关系。
与相同类型和形状的数组 a .
参见
ndarray.sort
方法对数组进行就地排序。
argsort
间接排序。
lexsort
多个键上的间接稳定排序。
searchsorted
在已排序的数组中查找元素。
partition
部分排序。
笔记
各种排序算法的特点是它们的平均速度、最坏情况性能、工作空间大小以及它们是否稳定。稳定排序将具有相同键的项保持在相同的相对顺序中。NumPy实现了以下四个属性:
友善的
速度
最坏情况
工作空间
稳定的
“快速排序”
1
O(n ^ 2)
0
不
“堆排序”
3
o(n*log(n))
“合并”
2
~n/2
对
'蒂姆索特'
注解
数据类型确定实际使用的是“mergesort”或“timsort”,即使指定了“mergesort”。更精细的用户选择当前不可用。
所有排序算法在沿着除最后一个轴以外的任何轴排序时都会临时复制数据。因此,沿最后一个轴排序比沿任何其他轴排序更快,占用的空间也更少。
复数的排序顺序是词典。如果实部和虚部都不是NaN,则顺序由实部确定,除非它们相等,在这种情况下,顺序由虚部确定。
在numpy 1.4.0之前,对包含NaN值的实数组和复杂数组进行排序会导致未定义的行为。在numpy版本中,大于等于1.4.0的NaN值被排序到末尾。扩展排序顺序为:
真实的: [南,南] 复合物: [R+RJ、R+NANJ、NAN+RJ、NAN+NANJ]
真实的: [南,南]
复合物: [R+RJ、R+NANJ、NAN+RJ、NAN+NANJ]
其中r是非NaN实值。具有相同NaN位置的复杂值将根据非NaN部分(如果存在)进行排序。非NaN值按之前的顺序排序。
1.12.0 新版功能.
快速排序已更改为 introsort . 当排序没有取得足够的进展时,它会切换到 heapsort . 这个实现使得最坏情况下的快速排序O(n*log(n))。
“稳定”自动为要排序的数据类型选择最佳稳定排序算法。它与“mergesort”一起当前映射到 timsort 或 radix sort 取决于数据类型。API前向兼容性目前限制了选择实现的能力,并且它是针对不同数据类型的硬连线。
1.17.0 新版功能.
Timsort是为了在已经或即将排序的数据上获得更好的性能而添加的。在随机数据上,timsort几乎与mergesort相同。它现在用于稳定排序,而如果未选择“无”,则快速排序仍然是默认排序。有关详细信息,请参阅 CPython listsort.txt . '对于整数数据类型,“mergesort”和“stable”映射到基数排序。基数排序是O(n)排序,而不是O(n logn)。
在 1.18.0 版更改.
为了与NaN保持一致,NaT现在排序到数组的末尾。
实例
>>> a = np.array([[1,4],[3,1]]) >>> np.sort(a) # sort along the last axis array([[1, 4], [1, 3]]) >>> np.sort(a, axis=None) # sort the flattened array array([1, 1, 3, 4]) >>> np.sort(a, axis=0) # sort along the first axis array([[1, 1], [3, 4]])
使用 order 关键字指定对结构化数组排序时要使用的字段:
>>> dtype = [('name', 'S10'), ('height', float), ('age', int)] >>> values = [('Arthur', 1.8, 41), ('Lancelot', 1.9, 38), ... ('Galahad', 1.7, 38)] >>> a = np.array(values, dtype=dtype) # create a structured array >>> np.sort(a, order='height') array([('Galahad', 1.7, 38), ('Arthur', 1.8, 41), ('Lancelot', 1.8999999999999999, 38)], dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])
按年龄排序,如果年龄相等,则按身高排序:
>>> np.sort(a, order=['age', 'height']) array([('Galahad', 1.7, 38), ('Lancelot', 1.8999999999999999, 38), ('Arthur', 1.8, 41)], dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])