1次元のndarrayのsortまとめ

list型のsort

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

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

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は、こちらでやる方がいいと思います。

# 昇順にソート
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 がわかります。

# 昇順にソート
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をある列でソートして、別の列の要素を抜き出すときに使ったりします。

# スコアと名前の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']