numpy.sort#

numpy.sort(a, axis=-1, kind=None, order=None, *, stable=None)[原始碼]#

返回陣列的已排序副本。

參數:
aarray_like

要排序的陣列。

axisint 或 None,可選

沿著要排序的軸。如果為 None,則在排序前將陣列展平。預設值為 -1,這會沿著最後一個軸排序。

kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’},可選

排序演算法。預設值為 ‘quicksort’。請注意,‘stable’ 和 ‘mergesort’ 都會在底層使用 timsort 或 radix sort,並且通常實際的實作會因資料類型而異。保留 ‘mergesort’ 選項是為了向後相容性。

orderstr 或 str 列表,可選

a 是具有定義欄位的陣列時,此引數指定首先要比較的欄位,然後是第二個欄位,依此類推。單個欄位可以指定為字串,並且不需要指定所有欄位,但未指定的欄位仍將使用,按照它們在 dtype 中出現的順序來打破平局。

stablebool,可選

排序穩定性。如果 True,則返回的陣列將保持比較相等的 a 值的相對順序。如果 FalseNone,則不保證這一點。在內部,此選項選擇 kind='stable'。預設值:None

版本 2.0.0 新增。

返回:
sorted_arrayndarray

a 具有相同類型和形狀的陣列。

參見

ndarray.sort

原地排序陣列的方法。

argsort

間接排序。

lexsort

在多個鍵上的間接穩定排序。

searchsorted

在已排序陣列中查找元素。

partition

部分排序。

註解

各種排序演算法的特點在於它們的平均速度、最壞情況效能、工作空間大小以及它們是否穩定。穩定排序會保持具有相同鍵的項目具有相同的相對順序。NumPy 中實作的四種演算法具有以下屬性

kind

速度

最壞情況

工作空間

穩定

‘quicksort’

1

O(n^2)

0

‘heapsort’

3

O(n*log(n))

0

‘mergesort’

2

O(n*log(n))

~n/2

‘timsort’

2

O(n*log(n))

~n/2

註記

資料類型決定了實際使用 ‘mergesort’ 還是 ‘timsort’,即使指定了 ‘mergesort’。目前無法進行更精細的使用者選擇。

為了效能,如果需要使資料沿排序軸在記憶體中連續sort 會建立一個臨時副本。為了獲得更好的效能並減少記憶體消耗,請確保陣列已經沿排序軸連續。

複數的排序順序是詞典編纂順序。如果實部和虛部都不是 nan,則順序由實部決定,除非它們相等,在這種情況下,順序由虛部決定。

在 numpy 1.4.0 之前,排序包含 nan 值的實數和複數陣列會導致未定義的行為。在 numpy 版本 >= 1.4.0 中,nan 值會排序到末尾。擴展的排序順序是

  • 實數:[R, nan]

  • 複數:[R + Rj, R + nanj, nan + Rj, nan + nanj]

其中 R 是一個非 nan 實數值。具有相同 nan 位置的複數值會根據非 nan 部分(如果存在)進行排序。非 nan 值與之前一樣排序。

quicksort 已更改為:introsort。當排序沒有取得足夠的進展時,它會切換到 heapsort。此實作使 quicksort 在最壞情況下為 O(n*log(n))。

‘stable’ 自動選擇最適合要排序的資料類型的穩定排序演算法。它與 ‘mergesort’ 目前都對應到 timsortradix sort,具體取決於資料類型。API 向前相容性目前限制了選擇實作的能力,並且針對不同的資料類型進行了硬編碼。

新增 Timsort 是為了在已排序或接近排序的資料上獲得更好的效能。在隨機資料上,timsort 幾乎與 mergesort 相同。現在它用於穩定排序,而 quicksort 仍然是未選擇任何排序時的預設排序。有關 timsort 的詳細資訊,請參閱 CPython listsort.txt。‘mergesort’ 和 ‘stable’ 對於整數資料類型對應到 radix sort。Radix sort 是一種 O(n) 排序,而不是 O(n log n)。

NaT 現在排序到陣列的末尾,以與 NaN 保持一致。

範例

>>> import numpy as np
>>> 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')])