附錄A? 高階Numpy
A.6 更多關于排序的內(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用戶對于列表(假設列表名為values)的一種"技巧"很熟悉句灌,即values[::-1]會返回一個反序的列表。對ndarray也是一樣(見圖A-3)
A.6.1 間接排序:argsort和lexsort
?????? 在數(shù)據(jù)分析中欠拾,你可能需要通過一個或多個鍵對數(shù)據(jù)集進行重新排序胰锌。例如,有關某些學生的數(shù)據(jù)表可能需要按姓氏排序藐窄,然后按名字排序资昧。這是一個間接排序的例子,如果你讀過pandas相關的章節(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ù)據(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)性能(對于復雜性增益),但其平均性能比默認的quicksort方法更差俊卤。請參閱表A-3嫩挤,了解可用方法及其相對性能(和性能保證)的總結。這是大多數(shù)用戶永遠不必考慮的事情消恍,但知道它的存在是有用的岂昭。
A.6.3 數(shù)組的部分排序
??????? 排序的目標之一可以是確定數(shù)組中最大或最小的元素。NumPy已經(jīng)優(yōu)化了方法numpy. partition和np.argpartition狠怨,用于圍繞第k個最小元素對數(shù)組進行分區(qū)约啊。
1.numpy. partition方法排序(見圖A-8)
注:在調(diào)用partition(arr,3)之后颖对,結果中的前三個元素是最小的三個值昵慌,并不是特定的順序。
2.numpy.argpartition類似于numpy.argsort排序,它返回的是將數(shù)據(jù)重新排列為等價順序的索引(見圖A-9)
A.6.4 numpy.searchsorted:在已排序的數(shù)組尋找元素
1.searchsorted是一個數(shù)組方法茵汰,它對已排序數(shù)組執(zhí)行二分搜索,返回數(shù)組中需要插入值的位置以保持排序(見圖A-10)
2.應用2
????????? 假設我們有一個介于0和10,000之間的數(shù)值孽鸡,以及我們想用來分隔數(shù)據(jù)的單獨的“桶邊界”數(shù)組(見圖A-11)