附錄A? 高階Numpy
A.6 更多關(guān)于排序的內(nèi)容
1.ndarray的sort實例方法
?????? 和Python的內(nèi)建列表類似,ndarray的sort實例方法是一種原位排序,意味著數(shù)組的內(nèi)容進行了重排列,而不是生成了一個新的數(shù)組(見圖A-1)

注:在進行數(shù)組原位排序時,請記住如果數(shù)組是不同ndarray的視圖的話,原始數(shù)組將會被改變
2.numpy.sort方法
??????? 另一方面,numpy.sort產(chǎn)生的是一個數(shù)組的新的、排序后的副本。否則,它接受與ndarray.sort相同的參數(shù)(如kind)(見圖A-2)

3.降序排序
?????? 你可能會注意到所有的排序方法都沒有降序排列的選項。這是一個實踐中的問題,因為數(shù)組切片會產(chǎn)生視圖,因此不需要生成副本也不需要任何計算工作。很多Python用戶對于列表(假設(shè)列表名為values)的一種"技巧"很熟悉,即values[::-1]會返回一個反序的列表。對ndarray也是一樣(見圖A-3)

A.6.1 間接排序:argsort和lexsort
?????? 在數(shù)據(jù)分析中,你可能需要通過一個或多個鍵對數(shù)據(jù)集進行重新排序。例如,有關(guān)某些學(xué)生的數(shù)據(jù)表可能需要按姓氏排序,然后按名字排序。這是一個間接排序的例子,如果你讀過pandas相關(guān)的章節(jié),你已經(jīng)看到了許多更高級的例子。給定一個或多個鍵(一個或多個值的數(shù)組),你希望獲得一個整數(shù)索引(我將它們通稱為索引器)數(shù)組,整數(shù)索引將告訴你如何重新排列數(shù)據(jù)為指定順序。兩種實現(xiàn)該功能的方法是argsort和numpy.lexsort。
1.argsort方法
示例1:(見圖A-4)

示例2:(見圖A-5)

2.lexsort方法
?????? lexsort類似于argsort,但它對多鍵數(shù)組執(zhí)行間接字典排序。假設(shè)我們想對一些由名字和姓氏標(biāo)識的數(shù)據(jù)進行排序((見圖A-6)

?????? 在你第一次使用lexsort時,lexsort可能有點令人困惑,因為用于排序數(shù)據(jù)的鍵的順序從傳遞的最后一個數(shù)組開始。這里,last_name在first_name之前使用。
? ? ?? pandas的方法,比如Series和DataFrame的sort_values方法是對這些方法的變相實現(xiàn)(這些方法也必須要考慮缺失值)。
A.6.2 其他的排序算法
????? 穩(wěn)定排序算法保留了相等元素的相對位置。在相對順序有意義的間接排序中,這可能尤其重要(見圖A-7)

??????? 唯一可用的穩(wěn)定排序是mergesort,它保證了O(n log n)性能(對于復(fù)雜性增益),但其平均性能比默認(rèn)的quicksort方法更差。請參閱表A-3,了解可用方法及其相對性能(和性能保證)的總結(jié)。這是大多數(shù)用戶永遠不必考慮的事情,但知道它的存在是有用的。

A.6.3 數(shù)組的部分排序
??????? 排序的目標(biāo)之一可以是確定數(shù)組中最大或最小的元素。NumPy已經(jīng)優(yōu)化了方法numpy. partition和np.argpartition,用于圍繞第k個最小元素對數(shù)組進行分區(qū)。
1.numpy. partition方法排序(見圖A-8)

注:在調(diào)用partition(arr,3)之后,結(jié)果中的前三個元素是最小的三個值,并不是特定的順序。
2.numpy.argpartition類似于numpy.argsort排序,它返回的是將數(shù)據(jù)重新排列為等價順序的索引(見圖A-9)

A.6.4 numpy.searchsorted:在已排序的數(shù)組尋找元素
1.searchsorted是一個數(shù)組方法,它對已排序數(shù)組執(zhí)行二分搜索,返回數(shù)組中需要插入值的位置以保持排序(見圖A-10)

2.應(yīng)用2
????????? 假設(shè)我們有一個介于0和10,000之間的數(shù)值,以及我們想用來分隔數(shù)據(jù)的單獨的“桶邊界”數(shù)組(見圖A-11)
