1次元のndarrayのsortまとめ

list型のsort

ndarray の前に list 型の sort のおさらいをします。
ソート HOW TO

Python

    li = [3, 1, 4, 2]
    print(li)
    print(type(li))
    # [3, 1, 4, 2]
    # <class 'list'>
        
    # 昇順にソート
    li = [3, 1, 4, 2]
    li = sorted(li, reverse=False)
    print(li)
    print(type(li))
    # [1, 2, 3, 4]
    # <class 'list'>
    
    # 降順にソート
    li = [3, 1, 4, 2]
    li = sorted(li, reverse=True)
    print(li)
    print(type(li))
    # [4, 3, 2, 1]
    # <class 'list'>
    
    # 戻り値はNoneになる。オブジェクトIDも変わる。
    li = [3, 1, 4, 2]
    print('id:', id(li))
    li = li.sort(reverse=True)
    print('id:', id(li))
    print(li)
    print(type(li))
    # id: 140498851486272
    # id: 9484816
    # None
    # <class 'NoneType'>
    
    # オブジェクトIDは変わらない。
    li = [3, 1, 4, 2]
    print('id:', id(li))
    li.sort(reverse=True)
    print('id:', id(li))
    print(li)
    print(type(li))
    # id: 140498851486272
    # id: 140498851486272
    # [4, 3, 2, 1]
    # <class 'list'>

1次元のndarrayのsort

ndarray の sort はいろいろありますが、3つ取り上げます。
numpy.ndarray.sort
numpy.sort
numpy.argsort

numpy.ndarray.sort

Python

    nda = np.array([3, 1, 4, 2])
    print(nda)
    print(type(nda))
    # [3 1 4 2]
    # <class 'numpy.ndarray'>
        
    # 戻り値はNoneになる。
    nda = nda.sort()
    print(nda)
    print(type(nda))
    # None
    # <class 'NoneType'>
    
    # 昇順にソート (降順にソートする方法は無いみたい。)
    nda = np.array([3, 1, 4, 2])
    nda.sort()
    print(nda)
    print(type(nda))
    # [1 2 3 4]
    # <class 'numpy.ndarray'>

numpy.sort

ndarray の sort は、こちらでやる方がいいと思います。

Python

    # 昇順にソート
    nda = np.array([3, 1, 4, 2])
    nda = np.sort(nda)
    print(nda)
    print(type(nda))
    # [1 2 3 4]
    # <class 'numpy.ndarray'>
        
    # 降順にソート
    nda = np.array([3, 1, 4, 2])
    nda = np.sort(nda)[::-1]
    print(nda)
    print(type(nda))
    # [4 3 2 1]
    # <class 'numpy.ndarray'>

numpy.argsort

機械学習の評価でたまに使うのが、この np.argsort です。
ソートした値ではなく、ソートした Index がわかります。

Python

    # 昇順にソート
    nda = np.array([3, 1, 4, 2])
    nda = np.argsort(nda)
    print(nda)
    print(type(nda))
    # [1 3 0 2]
    # <class 'numpy.ndarray'>
        
    # 降順にソート
    nda = np.array([3, 1, 4, 2])
    nda = np.argsort(nda)[::-1]
    print(nda)
    print(type(nda))
    # [2 0 3 1]
    # <class 'numpy.ndarray'>

argsortの用途

DataFrameをある列でソートして、別の列の要素を抜き出すときに使ったりします。

Python

    # スコアと名前のDataFrameを作成する。
    df = pd.DataFrame([[4, 'aa'], [2, 'bb'], [8, 'cc'],[7, 'dd']], columns=['score', 'name'])
    print(df)
    #    score name
    # 0      4   aa
    # 1      2   bb
    # 2      8   cc
    # 3      7   dd
        
    # スコアを昇順でソートしたときのIndex情報
    print(np.argsort(df['score']))
    # 0    1
    # 1    0
    # 2    3
    # 3    2
    # Name: score, dtype: int64
    
    # スコアを降順でソートしたときのIndex情報
    print(np.argsort(df['score'])[::-1])
    # 3    2
    # 2    3
    # 1    0
    # 0    1
    # Name: score, dtype: int64
    
    # スコアが良い順に名前を取得する。
    print(df.loc[np.argsort(df['score'])[::-1], 'name'].values)
    # ['cc' 'dd' 'aa' 'bb']
    
    # スコア上位2名の名前を取得する。
    print(df.loc[np.argsort(df['score'])[::-1], 'name'][:2].values)
    # ['cc' 'dd']