いつもソートのやり方で迷うので,まとめておくことにしましょう。
基本の挙動
リストでも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])