本記事では、2次元の配列に絞り、ソートする際にどの axis
の方向に並び替えられるかの挙動について整理します。
前提: numpy配列のaxisについて
numpyでは,上のイラストのように,縦方向を axis=0
, 横方向を axis=1
として扱われます.
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 方向(横方向)にソートしたい場合
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
の意味を知り、どうコードを書けば所望の並び替えができるか知っておく必要があります。
参考サイトも載せておくので、ご興味があれば適宜ご参照ください。
コメント