[Numpy, sort] 2次元配列の並び替え 3パターンを解説

記事内に広告が含まれています。

本記事では、2次元の配列に絞り、ソートする際にどの axis の方向に並び替えられるかの挙動について整理します。

前提: numpy配列のaxisについて

二次元配列とaxisの関係性について
(出典: NumPyの軸(axis)と次元数(ndim)とは何を意味するのか)

numpyでは,上のイラストのように,縦方向を axis=0, 横方向を axis=1 として扱われます.

axis=0 方向(縦方向)にソートしたい場合

ソートのイメージ図.axis=0方向で並び替える方法です.

numpyに用意されている np.sort() を使うことで上記の並び替えをすることができます.注意点として,オプションの axis=0 は必須です!

c = np.array([[2,1],[10,4], [4,5]])
print(c)
#[[ 2  1]
# [10  4]
# [ 4  5]]

print(np.sort(c, axis=0)) #各列(2,10,4 と 1,4,5 )で比較・並び替え
#[[ 1  2]
# [ 4  4]
# [10  5]]

axis=1 方向(横方向)にソートしたい場合

ソートのイメージ図. axis=1方向で並び替える方法です.並び替え後,1列目の値(青)<2列目(赤)の順に並びます.

sort()をそのまま使うと、横方向に並び替えられます。すなわち、(デフォルトでは) axis=1 の方向で並び替えられます。(厳密にはaxis=-1 であるため、2次元ではaxis=1 と言えます。)

c = np.array([[2,1],[10,4], [4,5]])
print(c)
#[[ 2  1]
# [10  4]
# [ 4  5]]

print(np.sort(c)) #cの各行( 2と1, 10と4, 4と5 )同士を並び替える
#[[ 1,  2],
# [ 4, 10],
# [ 4,  5]]


print(np.sort(c, axis=0)) #cの各列( 2,10,4 と 1,4,5 )を並び替える
#[[ 2  1]
# [ 4  4]
# [10  5]]

この場合、配列の配列のように行単位で一つのデータのまとまりとして管理する場合は好ましくありません。例えば、[[2,1],[10,4], [4,5]] を、各行の先頭の数字基準で [[2,1], [4,5], [10,4]] にしたい場合です。

axis=0 方向(縦方向)に行ごと並び替える方法

ソートのイメージ図.縦方向に行ごと並び替えるイメージ

配列の各行の中身は変えずに,行ごとの順番を変える主な方法は以下の2つが挙げられます。

  • np.argsort() を用いて並び替えたインデックスの配列を用いる方法
  • sorted() メソッドを用いる方法

np.argsort() を用いる方法

#1
arr = np.array([[2,1],[10,4], [4,5]])
col = arr[:,0] # [2, 10, 4] , 列だけ取得
index = np.argsort(col)#取り出した列を並び替え、何番目になるかを計算, [0, 2, 1]
arr_sort = arr[index]

print(arr_sort)

#[[ 2  1]
# [ 4  5]
# [10  4]]

3行目で np.argsort() を用いています。このメソッドは、与えた配列を並び替えた際に、その要素が先頭から何番目になるかを返してくれます。注意として、先頭は0から始まります。

index = np.argsort(col)#取り出した列を並び替えた際、何番目になるかを計算, [0, 2, 1]

上の例の場合、[2,10,4] を昇順に並び替えると [2,4,10] となります。

先頭(0番目)の数字が2, 先頭から1番目の数字が4, 先頭から2番目の数字が10となるので、np.argsort()の返す値は [0,2,1]となります。

言い換えると、argsort(col) の返り値の意味は、以下のように解釈できます。

np.argsort([2,10,4]) =[0,2,1] = [2は先頭から0番目に移動, 10は先頭から2番目に移動, 4は先頭から1番目に移動]

sorted() メソッドを用いる方法

arr = np.array([[2,1],[10,4], [4,5]])
arr_sorted = sorted(arr, key=lambda x: x[0])
arr_sorted = np.array(arr_sorted)
print(arr_sorted)

#[[ 2  1]
# [ 4  5]
# [10  4]]

2行目では、lambda関数を使ってどの位置の数字を基準にソートするかを決めています。

また、sorted() メソッドでは返り値がリスト形式になるため、最後にnp.array()で型の変換を行なっています。

まとめ

pythonにおける二次元配列のソートの方法についてまとめました。 axis の意味を知り、どうコードを書けば所望の並び替えができるか知っておく必要があります。

参考サイトも載せておくので、ご興味があれば適宜ご参照ください。

numpy.sort — NumPy v2.1 Manual
numpy.argsort — NumPy v2.1 Manual
ソートのテクニック
著者, Andrew Dalke and Raymond Hettinger,. Python のリストにはリストをインプレースに変更する、組み込みメソッド list.sort() があります。他にもイテラブルからソートしたリストを作成する...
Python
スポンサーリンク

コメント