numpy.sort

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

numpy.sort(a, axis=-1, kind='quicksort', order=None)[source]

返回数组的排序副本。

参数:

a:array_like

数组要排序。

axis:int或None,可选

要排序的轴。如果为“无”,则在排序之前将数组展平。默认值为-1,沿最后一个轴排序。

kind:{'quicksort','mergesort','heapsort'},可选

排序算法。默认值为“quicksort”。

order:str或str的列表,可选

a是定义了字段的数组时,此参数指定首先,第二等比较哪些字段。单个字段可以指定为字符串,并且不是所有字段都需要指定,但是未指定的字段仍将按照它们在dtype中出现的顺序使用,以断开关系。

返回:

sorted_array:ndarray

数组的类型和形状与a相同。

也可以看看

ndarray.sort
对数组进行就地排序的方法。
argsort
间接排序。
lexsort
对多个键进行间接稳定排序。
searchsorted
在已排序的数组中查找元素。
partition
部分排序。

笔记

各种排序算法的特征在于它们的平均速度,最坏情况性能,工作空间大小,以及它们是否稳定。稳定排序使用具有相同相对顺序的相同键的项目。这三种可用的算法具有以下属性:

速度 最坏的情况下 工作空间 稳定
'quicksort' 1 O(n ^ 2) 0 没有
'mergesort' 2 O(n * log(n)) 〜n / 2
'heapsort' 3 O(n * log(n)) 0 没有

所有排序算法在沿着除最后一个轴之外的任何排序时创建数据的临时副本。因此,沿着最后一个轴的排序更快,并且比沿着任何其它轴的排序使用更少的空间。

复数的排序顺序是字典。如果实部和虚部都是非纳米,则阶数由实部确定,除非它们相等,在这种情况下,阶数由虚部确定。

在numpy 1.4.0之前排序包含nan值的真实和复杂数组导致未定义的行为。在numpy版本> = 1.4.0 nan值排序到结束。扩展的排序顺序为:

  • 实:[R,nan]
  • 复数:[R + Rj,R + nanj,nan + Rj,nan + nanj]

其中R是非纳米实数值。具有相同纳米位置的复数值根据非纳米部分(如果存在)进行排序。非nan值按照前面的顺序排序。

例子

>>> 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')])