Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

python: ソート(sort)

いつもソートのやり方で迷うので,まとめておくことにしましょう。

 

基本の挙動

リストでもndarrayでascendします。

>>> a = np.random.rand(10)
>>> a
array([ 0.32496596, 0.74999976, 0.77499606, 0.20691008, 0.307734 ,
0.72823673, 0.28689177, 0.40670341, 0.19758518, 0.85783996])
>>> b = [1, 2, 3, 4, 5, -5, -4, -3, -2, -1]
>>> a_sorted = np.sort(a)
>>> a_sorted
array([ 0.19758518, 0.20691008, 0.28689177, 0.307734 , 0.32496596,
0.40670341, 0.72823673, 0.74999976, 0.77499606, 0.85783996])
>>> a       # 非破壊
array([ 0.32496596, 0.74999976, 0.77499606, 0.20691008, 0.307734 ,
0.72823673, 0.28689177, 0.40670341, 0.19758518, 0.85783996])

>>> b.sort()
>>> b   # 破壊される
[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]

descendさせたいときはひっくり返す定番処理が必要です。reverseはやはり破壊的です。

>>> a_sorted_reverse = a[::-1]
>>> a_sorted_reverse
array([ 0.85783996,  0.19758518,  0.40670341,  0.28689177,  0.72823673,
        0.307734  ,  0.20691008,  0.77499606,  0.74999976,  0.32496596])
>>> c = b[::-1]
>>> c
[5, 4, 3, 2, 1, -1, -2, -3, -4, -5]
>>> b
[-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]
>>> b.reverse()
>>> b
[5, 4, 3, 2, 1, -1, -2, -3, -4, -5]

インデックスをとる

インデックスが欲しいときにはnp.argsortですね。ただのリストのメソッドにはないのかなぁ?

>>> idx = np.argsort(a)
>>> idx
array([8, 3, 6, 4, 0, 7, 5, 1, 2, 9])
>>> e = a[idx]
>>> e
array([ 0.19758518, 0.20691008, 0.28689177, 0.307734 , 0.32496596,
0.40670341, 0.72823673, 0.74999976, 0.77499606, 0.85783996])

>>> b = [1, 2, 3, 4, 5, -5, -4, -3, -2, -1]
>>> idx2 = np.argsort(b)
>>> idx2
array([5, 6, 7, 8, 9, 0, 1, 2, 3, 4])