Python

Numpyを使ったソートの仕方

By 2021年6月20日No Comments

この記事ではNumpy配列ndarrayの値を昇順や降順と言ったように並び替える方法(ソート)を解説します。

配列のソートはデータの分析や解析時によく使われる操作です。Numpy関数を使って効率よくデータを操作できるようになりましょう。

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講座レビューリスト
HOSL

Author HOSL

More posts by HOSL