官網的定義:
解釋:在指定的維度下,對給定的數組進行從小到大排序,最後一個數組爲主排序數組,其與數組爲輔助排序數組,返回的是主排序數組的索引.
例子:
加上索引後的a:
加上索引後的b:
numpy.lexsort((b, a)) 函數的含義:
先對數組a按照從小到大的順序進行排序, 對於數組a中相同的數字,無法進行排序比較.則去數組b中找相同索引所對應的值,並依據他們的大小來對a中相同索引對應的值進行排序,最後返回排好序之後的數組a的索引值.
對a進行初次排序後的值如下,其中3和5的索引能確定,但是1和4現在沒法確定,因爲當出現相同的數字時, lexsort的排序不是按照它原來的順序來排序的.
此時,對於數組a中的1, 我們根據其索引值到數組b中去找相同索引值所對應的數字,然後根據他們的大小來確定a中相同數字的排序順序. 如a中1的索引值爲0和2, 我們在b中找索引值爲0和2的數字是9和2. 因爲2小於9,所以a中索引爲2對應的數字排在索引爲0對應的數字之前. 如此得到如下二次排序的結果:
依次,對於a中無法確定順序的3個4. 注意他們在a中的索引值爲:3,5,6. 我們在b中找相同索引所對應的數字.因爲索引3對應的數字是4, 索引5對應的數字是2, 索引6對應的數字是1. 所以可以看到在b中, 索引6對應的數字<索引5對應的數字<索引3對應的數字. 相應的a中出現的順序爲:索引6對應的數字,索引5對應的數字,索引3對應的數字.於是,最終的排序如下:
代碼驗證:
另一個比較複雜的例子:
numpy.lexsort((f, e, g))
對上面語句的分析: 先對e進行從小到大排序, f作爲e的輔助排序.注意e的排序結果索引保持不變.然後對g進行從小到大的排序,e的排序結果作爲g的輔助排序.
對e,f,g分別加上索引後的值如下:
按照上面的分析,先對e進行第一次從小到大的排序後成如下的結果. 其中3和3, 5和5排序索引暫時無法確定.
e中,數字 3 對應的索引爲 0 和 5, 索引 0 和 5 在f中對應的數字爲 8 和 8, 此時8和8無法進行比較排序,所以 e 中的 3 按出現的順序排序. 即爲:索引 0 對應的 3 在索引 5 對應的 3 之前.
同理,對於e中的兩個5, 其對應的索引爲 1 和 6.則在 f 中,相同的索引對應的數值爲 9 和 1.所以,e中索引爲 6 對應的 5 排在索引爲 1 對應的 5 之前.
綜上,e最終的排序如下:
接下來繼續對 g 進行從小到大的排序, g的初次排序如下:
其中 4 和 4, 7和 7 的排序索引無法確定. 對於g中的 4 和 4, 其索引爲 0 和 4, 在e中,相同的索引對應的數值爲 3 和 8. 因爲3<8, 所以在g中,索引 0 對應的 4 排在索引 4 對應的 4 之前.同理可得g中索引 5 對應的 7 排在索引 1 對應的 7 之前.
綜上,g最終的排序如下:
numpy.lexsort((f, e, g)) 輸出的內容爲:[6 2 0 4 5 1 3]
代碼驗證: