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
值的相對順序。如果False
或None
,則不保證這一點。在內部,此選項選擇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’ 目前都對應到 timsort 或 radix 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')])