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']