《利用Python進行數(shù)據(jù)分析》 附錄 A.6更多關(guān)于排序的內(nèi)容

附錄A? 高階Numpy


A.6 更多關(guān)于排序的內(nèi)容

1.ndarray的sort實例方法

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

圖A-1:ndarray的sort實例方法

:在進行數(shù)組原位排序時,請記住如果數(shù)組是不同ndarray的視圖的話,原始數(shù)組將會被改變

2.numpy.sort方法

??????? 另一方面,numpy.sort產(chǎn)生的是一個數(shù)組的新的、排序后的副本。否則,它接受與ndarray.sort相同的參數(shù)(如kind)(見圖A-2)

圖A-2:numpy.sort方法

3.降序排序

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

圖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)

圖A-4:簡單示例

示例2:(見圖A-5)

圖A-5:二維數(shù)組按照第一行排序

2.lexsort方法

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

圖A-6:lexsort方法

?????? 在你第一次使用lexsort時,lexsort可能有點令人困惑,因為用于排序數(shù)據(jù)的鍵的順序從傳遞的最后一個數(shù)組開始。這里,last_name在first_name之前使用。

? ? ?? pandas的方法,比如Series和DataFrame的sort_values方法是對這些方法的變相實現(xiàn)(這些方法也必須要考慮缺失值)。


A.6.2 其他的排序算法

????? 穩(wěn)定排序算法保留了相等元素的相對位置。在相對順序有意義的間接排序中,這可能尤其重要(見圖A-7)

圖A-7:穩(wěn)定排序

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

表A-3:數(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)

圖A-8:部分排序

注:在調(diào)用partition(arr,3)之后,結(jié)果中的前三個元素是最小的三個值,并不是特定的順序。

2.numpy.argpartition類似于numpy.argsort排序,它返回的是將數(shù)據(jù)重新排列為等價順序的索引(見圖A-9)

圖A-9:numpy.argpartition方法

A.6.4 numpy.searchsorted:在已排序的數(shù)組尋找元素

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

圖A-10:searchsorted方法

2.應(yīng)用2

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

圖A-11:應(yīng)用2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 資料來源:https://github.com/BrambleXu/pydata-notebook 在這篇附錄中,...
    林清貓耳閱讀 980評論 0 4
  • 基礎(chǔ)篇NumPy的主要對象是同種元素的多維數(shù)組。這是一個所有的元素都是一種類型、通過一個正整數(shù)元組索引的元素表格(...
    oyan99閱讀 5,290評論 0 18
  • 資料來源:https://github.com/BrambleXu/pydata-notebook NumPy(N...
    林清貓耳閱讀 1,657評論 0 20
  • 137累積法【子揚媽媽】第127天【20180828】 讀經(jīng)內(nèi)容1.易經(jīng)周易下經(jīng)62、63、64卦;2.笠翁對韻上...
    楊鳳娟_5e5c閱讀 99評論 0 0
  • 鴿子被烏鴉吃了 它渾身僵硬的躺在冰冷的甲板上 肚腹被啄開 內(nèi)臟已所剩無幾 周圍散落著潔白的羽毛 那曾是它漂亮的盔甲...
    韓家逆子_閱讀 366評論 0 0

友情鏈接更多精彩內(nèi)容