numpy.lexsort(): 排序

官網的定義:

解釋:在指定的維度下,對給定的數組進行從小到大排序,最後一個數組爲主排序數組,其與數組爲輔助排序數組,返回的是主排序數組的索引.

例子:

a = \left [ 1, 5,1,4,3,4,4\right ]

b = \left [ 9, 4, 0, 4, 0, 2, 1 \right ]

加上索引後的a:

a = \left [ 1_{0} ,5_{1} , 1_{2}, 4_{3}, 3_{4}, 4_{5}, 4_{6}}}}}} \right ]

加上索引後的b:

b = \left [ 9_{0}, 4_{1}, 0_{2}, 4_{3}, 0_{4}, 2_{5}, 1_{6}}}}}}}} \right ]

numpy.lexsort((b, a)) 函數的含義:

先對數組a按照從小到大的順序進行排序, 對於數組a中相同的數字,無法進行排序比較.則去數組b中找相同索引所對應的值,並依據他們的大小來對a中相同索引對應的值進行排序,最後返回排好序之後的數組a的索引值.

對a進行初次排序後的值如下,其中3和5的索引能確定,但是1和4現在沒法確定,因爲當出現相同的數字時, lexsort的排序不是按照它原來的順序來排序的.

a = \left [ 1, 1, 3_{4}}, 4, 4, 4, 5_{1}}\right ]

此時,對於數組a中的1, 我們根據其索引值到數組b中去找相同索引值所對應的數字,然後根據他們的大小來確定a中相同數字的排序順序. 如a中1的索引值爲0和2, 我們在b中找索引值爲0和2的數字是9和2. 因爲2小於9,所以a中索引爲2對應的數字排在索引爲0對應的數字之前. 如此得到如下二次排序的結果:

a = \left [ 1_{2}, 1_{0}, 3_{4}, 4, 4, 4, 5_{1}}}}} \right ] 

依次,對於a中無法確定順序的3個4. 注意他們在a中的索引值爲:3,5,6. 我們在b中找相同索引所對應的數字.因爲索引3對應的數字是4, 索引5對應的數字是2, 索引6對應的數字是1. 所以可以看到在b中, 索引6對應的數字<索引5對應的數字<索引3對應的數字. 相應的a中出現的順序爲:索引6對應的數字,索引5對應的數字,索引3對應的數字.於是,最終的排序如下:

a = \left [ 1_{2}, 1_{0}, 3_{4}, 4_{6}, 4_{5}, 4_{3}, 5_{1}}}}}}}} \right ]

代碼驗證:

另一個比較複雜的例子:

e = \left [ 3,5,2,1,8,3,5 \right ]

f = \left [ 8, 9, 0, 2, 0, 8, 1 \right ]

g = \left [ 4, 7, 2, 8, 4, 7, 1\right ]

numpy.lexsort((f, e, g))

對上面語句的分析: 先對e進行從小到大排序, f作爲e的輔助排序.注意e的排序結果索引保持不變.然後對g進行從小到大的排序,e的排序結果作爲g的輔助排序.

對e,f,g分別加上索引後的值如下:

e = \left [ 3_{0}, 5_{1}, 2_{2}, 1_{3}, 8_{4}, 3_{5}, 5_{6}}}}}}}} \right ]

f = \left [ 8_{0}}, 9_{1}}, 0_{2}}, 2_{3}}, 0_{4}}, 8_{5}}, 1_{6}} \right ]

g = \left [ 4_{0}}, 7_{1}}, 2_{2}}, 8_{3}}, 4_{4}}, 7_{5}}, 1_{6}} \right ]

按照上面的分析,先對e進行第一次從小到大的排序後成如下的結果. 其中3和3, 5和5排序索引暫時無法確定.

e = \left [ 1_{3}}, 2_{2}}, 3, 3, 5, 5, 8_{4}} \right ]

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最終的排序如下:

e = \left [ 1_{3}}, 2_{2}}, 3_{0}}, 3_{5}}, 5_{6}}, 5_{1}}, 8_{4}} \right ]

接下來繼續對 g 進行從小到大的排序, g的初次排序如下:

g = \left [ 1_{6}}, 2_{2}}, 4, 4, 7, 7, 8_{3}} \right ]

其中 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最終的排序如下:

g = \left [ 1_{6}}, 2_{2}}, 4_{0}}, 4_{4}}, 7_{5}}, 7_{1}}, 8_{3}} \right ]

numpy.lexsort((f, e, g)) 輸出的內容爲:[6 2 0 4 5 1 3]

代碼驗證:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章