`numpy` 數組通常是用於數值計算的多維數組,而排序功能可以快速、準確地對數據進行排序,從而得到更加清晰、易於分析的結果。 在數據分析和處理過程中,常常需要對數據進行排序,以便更好地理解和發現其中的規律和趨勢。 排序會應用在很多場景中,比如: 1. 數據分類:將數據按照一定的特征進行分類,可以通 ...
numpy
數組通常是用於數值計算的多維數組,而排序功能可以快速、準確地對數據進行排序,從而得到更加清晰、易於分析的結果。
在數據分析和處理過程中,常常需要對數據進行排序,以便更好地理解和發現其中的規律和趨勢。
排序會應用在很多場景中,比如:
- 數據分類:將數據按照一定的特征進行分類,可以通過
numpy
數組排序來實現。 - 數據篩選:通過
numpy
數組排序,可以快速地篩選出符合特定條件的數據。 - 數據合併:多個 numpy 數組可以通過 numpy 數組排序來進行合併,從而得到一個更加完整、準確的數據集。
1. 排序演算法
1.1. sort 函數
numpy
中常用排序演算法都是封裝好的,通過 sort
函數,可以直接使用常用的排序演算法。
import numpy as np
arr = np.random.randint(0, 100, 10)
print(arr)
#運行結果
[44 11 36 0 83 90 54 40 36 34]
arr.sort(kind='quicksort')
print(arr)
#運行結果
[ 0 11 34 36 36 40 44 54 83 90]
arr.sort(kind='mergesort')
print(arr)
#運行結果
[ 0 11 34 36 36 40 44 54 83 90]
arr.sort(kind='heapsort')
print(arr)
#運行結果
[ 0 11 34 36 36 40 44 54 83 90]
arr.sort(kind='stable')
print(arr)
#運行結果
[ 0 11 34 36 36 40 44 54 83 90]
四種排序演算法分別是:
- quicksort:快速排序
- mergesort:歸併排序
- heapsort:堆排序
- stable:冒泡排序
上述排序的結果都一樣,quicksort
是預設的排序演算法,也是效率最高的演算法。
1.2. argsort 函數
除了 sort
函數,還有一個比較常用的是 argsort
,它返回的是排序之後的索引。
arr = np.random.randint(0, 100, 10)
print(arr)
#運行結果
[71 59 96 30 71 24 22 60 99 94]
print(arr.argsort())
#運行結果
[6 5 3 1 7 0 4 9 2 8]
argsort 的結果是排序之後的原數組的下標。
比如第一個值 6
表示的是 arr[6]
,也就是 22
。
2. 行列排序
當數組是多維的時候,可以按照每個維度來排序。
比如二維數組:
arr = np.random.randint(0, 100, (3, 3))
print(arr)
#運行結果
[[14 18 6]
[80 85 14]
[95 24 82]]
arr.sort(axis=0)
print(arr)
#運行結果
[[14 18 6]
[80 24 14]
[95 85 82]]
axis=0
是跨行的意思,也就是按列對數據進行排序。
arr = np.random.randint(0, 100, (3, 3))
print(arr)
#運行結果
[[ 2 22 17]
[85 6 20]
[98 97 39]]
arr.sort(axis=1)
print(arr)
#運行結果
[[ 2 17 22]
[ 6 20 85]
[39 97 98]]
axis=1
是跨列的意思,也就是按行對數據進行排序。
註意:這種排序的方式會破壞原有元素之間的行列關係。
3. 部分排序
nunpy
的數組還支持部分排序,也就是只針對數組的特定部分排序,不用對整個數組排序。
arr = np.random.randint(0, 100, 10)
print(arr)
#運行結果
[13 94 71 6 47 81 99 12 49 20]
arr.partition(3)
print(arr)
#運行結果
[ 6 13 12 20 94 81 99 71 49 47]
partition(3)
表示的把最小的三個數字放在數組前三個,後面的元素就是原先剩下的元素,順序不管。
放在最前面的三個數是所有元素中最小的三個數,它們的順序也是不保證的。
多維數組也可以部分排序:
arr = np.random.randint(0, 100, (5, 5))
print(arr)
#運行結果
[[11 8 84 34 99]
[24 18 69 79 41]
[ 2 25 91 91 64]
[64 8 48 86 49]
[68 62 51 22 85]]
arr.partition(3, axis=0)
print(arr)
#運行結果
[[ 2 8 48 22 49]
[11 8 51 34 64]
[24 18 69 79 41]
[64 25 84 86 85]
[68 62 91 91 99]]
partition
之後,數組的前三行元素就是每列最小的三個數。
arr = np.random.randint(0, 100, (5, 5))
print(arr)
#運行結果
[[76 79 72 91 98]
[13 58 53 76 63]
[57 98 16 81 39]
[48 43 63 98 77]
[33 71 54 74 68]]
arr.partition(3, axis=1)
print(arr)
#運行結果
[[72 76 79 91 98]
[13 53 58 63 76]
[16 39 57 81 98]
[43 48 63 77 98]
[33 54 68 71 74]]
partition
之後,數組的前三列元素就是每行最小的三個數。
4. 總結回顧
numpy
數組排序提供了一種快速、靈活、可靠的排序方式,可以滿足各種排序需求。numpy
的排序針對數組做了更多的優化,排序效率比python
內置的排序演算法更高。