この記事ではNumpy配列ndarrayの値を昇順や降順と言ったように並び替える方法(ソート)を解説します。
配列のソートはデータの分析や解析時によく使われる操作です。Numpy関数を使って効率よくデータを操作できるようになりましょう。
目次
Udemyの動画学習でもPythonを勉強しよう!
「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!
UdemyのPythonおすすめ33講座レビューリストnumpy.sort()関数の使い方
まずはNumpyをインポートすることからプログラムを始めます。
import numpy as np
np.sortはNumpy配列の要素を昇順(小さい順)にソートする関数です。第一引数にソートする配列を渡します。np.sort()ではもとの配列は変化せず、新しい配列が作られます。
実際のコードで確認してみましょう。まずは1次元配列についてです。
array = np.random.randint(1, 100, 10) # 1以上100未満の乱数を10個生成します。
print(array)
# [22 38 50 10 72 87 69 92 93 56]
array_sort = np.sort(array) # 昇順にソートします。
print(array_sort)
# [10 22 38 50 56 69 72 87 92 93]
print(array) # もとの配列は変化していません。
# [22 38 50 10 72 87 69 92 93 56]
np.sort()を使ってももとの配列であるarrayは変化していないことがわかります。もとの配列自体をソートさせたものにする方法は次節で解説します。
降順にしたい場合には[::-1]を使います。
array_sort = np.sort(array)[::-1] # 降順にソートします。
print(array_sort)
# [93 92 87 72 69 56 50 38 22 10]
次に2次元配列をソートさせてみましょう。np.sort()の第二引数のaxisを指定することで行か列に対してのソートを指定することができます。指定しない場合行に対してソートされます。
array_2d = np.random.randint(1, 100, (4, 5)) # 1以上100未満、4行5列の乱数を生成します。
print(array_2d)
# [[66 27 19 11 67]
# [30 3 72 35 97]
# [36 52 43 80 3]
# [ 7 58 30 5 76]]
array_2d_row_sort = np.sort(array_2d) # axisを指定しない場合、行をソートします。
print(array_2d_row_sort)
# [[11 19 27 66 67]
# [ 3 30 35 72 97]
# [ 3 36 43 52 80]
# [ 5 7 30 58 76]]
array_2d_column_sort = np.sort(array_2d, axis=0) # 列ごとに昇順にソートします。
print(array_2d_column_sort)
# [[ 7 3 19 5 3]
# [30 27 30 11 67]
# [36 52 43 35 76]
# [66 58 72 80 97]]
array_2d_row_sort = np.sort(array_2d, axis=1) # 行ごとに昇順にソートします。
print(array_2d_row_sort)
# [[11 19 27 66 67]
# [ 3 30 35 72 97]
# [ 3 36 43 52 80]
# [ 5 7 30 58 76]]
2次元配列を降順にしたい場合にも[::-1]を使います。
array_2d_column_reverse = np.sort(array_2d, axis=0)[::-1] # 列ごとに降順にソートします。
print(array_2d_column_reverse)
# [[66 58 72 80 97]
# [36 52 43 35 76]
# [30 27 30 11 67]
# [ 7 3 19 5 3]]
.sort()の使い方
Numpy配列のメソッドとしてsort()があります。そのため、もとの配列の後ろに.sort()をつけることで配列自身がソートされます。このときnp.sort()とは異なり、配列そのものが置き換わります。引数によってaxisを指定することもできます。np.sort()と同じように、axisを指定しない場合はaxis=1の結果が返されます。
print(array_2d)
# [[66 27 19 11 67]
# [30 3 72 35 97]
# [36 52 43 80 3]
# [ 7 58 30 5 76]]
array_2d.sort(axis=0) # 列ごとに昇順にソートします。
print(array_2d)
# [[ 7 3 19 5 3]
# [30 27 30 11 67]
# [36 52 43 35 76]
# [66 58 72 80 97]]
array_2d.sort(axis=1) # 行ごとに昇順にソートします。
print(array_2d)
# [[ 3 3 5 7 19]
# [11 27 30 30 67]
# [35 36 43 52 76]
# [58 66 72 80 97]]
numpy.argsort()関数の使い方
np.argsort()は、配列をソートしたときのインデクスを返します。np.argsort()をうまく活用することでnp.sort()ではできない操作を行うことができます。
# 1次元配列の場合
print(array)
# [22 38 50 10 72 87 69 92 93 56]
array_argsort = np.argsort(array) # arrayを昇順にソートしたときその数字は元々どのインデクスだったかを返します。
print(array_argsort)
# [3 0 1 2 9 6 4 5 7 8]
# 2次元配列の場合
print(array_2d)
# [[66 27 19 11 67]
# [30 3 72 35 97]
# [36 52 43 80 3]
# [ 7 58 30 5 76]]
array_2d_argsort = np.argsort(array_2d, axis=0) # 列ごとにソート→数字があったインデクスを返す。
print(array_2d_argsort)
# [[3 1 0 3 2]
# [1 0 3 0 0]
# [2 2 2 1 3]
# [0 3 1 2 1]]
array_2d_argsort = np.argsort(array_2d, axis=1) # 行ごとにソート→数字があったインデクスを返す。
print(array_2d_argsort)
# [[3 2 1 0 4]
# [1 0 3 2 4]
# [4 0 2 1 3]
# [3 0 2 1 4]]
特定の行や列だけをソートする
次にある特定の行や列だけをソートする方法について解説します。スライスをうまく使うことで行うことができます。まずは行について、2次元配列について考えてみます。
print(array_2d)
# [[66 27 19 11 67]
# [30 3 72 35 97]
# [36 52 43 80 3]
# [ 7 58 30 5 76]]
print(array_2d[2, :]) # 3行目を出力します。
# [36 52 43 80 3]
print(np.sort(array_2d[2, :])) # 3行目のみをソートします。
# [ 3 36 43 52 80]
array_2d[2, :] = np.sort(array_2d[2, :]) # 3行目をソートしたものをもとの配列と置き換えます。
print(array_2d)
# [[66 27 19 11 67]
# [30 3 72 35 97]
# [ 3 36 43 52 80]
# [ 7 58 30 5 76]]
列についても同様です。
print(np.sort(array_2d[:, 0])) # 1列目のみをソートします。
# [ 3 7 30 66]
array_2d[:, 0] = np.sort(array_2d[:, 0]) # 1列目をソートしたものをもとの配列と置き換えます。
print(array_2d)
# [[ 3 27 19 11 67]
# [ 7 3 72 35 97]
# [30 36 43 52 80]
# [66 58 30 5 76]]
特定の行や列を基準にしてソートをする
指定した行や列を基準としてソートする方法について解説します。
# 特定の列を基準にしてソート
print(array_2d)
# [[66 27 19 11 67]
# [30 3 72 35 97]
# [36 52 43 80 3]
# [ 7 58 30 5 76]]
print(array_2d[:, 1]) # 2列目を出力します。
# [27 3 52 58]
print(np.argsort(array_2d[:, 1])) # 2列目のみをargsortします。
# [1 0 2 3]
array_2d_column_base = array_2d[np.argsort(array_2d[:, 1])] # 2列目のみ昇順になって、それに合わせて行ごとに移動します。
print(array_2d_column_base)
[[30 3 72 35 97]
[66 27 19 11 67]
[36 52 43 80 3]
[ 7 58 30 5 76]]
# 特定の行を基準にしてソート
print(array_2d[2, :]) # 3行目を出力します。
# [36 52 43 80 3]
print(np.argsort(array_2d[2, :])) # 3行目のみをargsortします。
# [4 0 2 1 3]
array_2d_row_base = array_2d[:, np.argsort(array_2d[2, :])] # 3行目のみ昇順になって、それに合わせて列ごとに移動します。
print(array_2d_row_base)
# [[67 66 19 27 11]
# [97 30 72 3 35]
# [ 3 36 43 52 80]
# [76 7 30 58 5]]
Udemyの動画学習でもPythonを勉強しよう!
「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!
UdemyのPythonおすすめ33講座レビューリスト