【NumPy】配列(ndarray)をソートする方法 sort、argsort
をソートする方法-_-sort-argsort-_-1.jpg)
NumPy の配列(ndarray)をソートする方法について解説します。
目次
配列をソートする
NumPy の配列(ndarray)を使用している場合には、配列をソートして順序を入れ替えたくなることがよくあります。
この記事では、NumPy の配列(ndarray)をソートする方法を紹介します。
ソートした配列を取得する sort
ソートした配列を取得する場合には、sort 関数を使用します。昇順、降順など各種使い方について紹介していきます。
昇順にソートする sort
配列を値の昇順にソートするには、以下のように sort 関数を使用します。
import numpy as np
x = np.array([5, 2, 4, 6, 1])
print(f'x = {x}')
# 昇順にソートする場合
x_sorted = np.sort(x)
print(f'x_sorted = {x_sorted}')【実行結果】 x = [5 2 4 6 1] x_sorted = [1 2 4 5 6]
sort 関数では、元の配列は変更されず、新しい ndarray オブジェクトが返されます。
降順にソートする
配列を値を降順にソートするには、スライスを使ってソートした配列を反転します。
Python 組み込みのリストのソートに慣れている人は「reverse=True」と指定したくなるかもしれませんが、NumPy の sort 関数には reverse 引数はありません。
import numpy as np
x = np.array([5, 2, 4, 6, 1])
print(f'x = {x}')
# 降順にソートする場合
x_sorted = np.sort(x)[::-1]
print(f'x_sorted = {x_sorted}')【実行結果】 x = [5 2 4 6 1] x_sorted = [6 5 4 2 1]
軸(axis)を指定してソートする
2 次元以上の配列を使用している際に、指定した軸に沿ってソートするには、axis を指定します。
import numpy as np
rand = np.random.RandomState(1)
X = rand.randint(0, 10, (5, 5))
print(f'X = \n{X}\n')
# 列ごとにソートする
X_sorted_col = np.sort(X, axis=0)
print(f'X_sorted (axis=0) = \n{X_sorted_col}\n')
# 行ごとにソートする
X_sorted_row = np.sort(X, axis=1)
print(f'X_sorted (axis=1) = \n{X_sorted_row}')【実行結果】 X = [[5 8 9 5 0] [0 1 7 6 9] [2 4 5 2 4] [2 4 7 7 9] [1 7 0 6 9]] X_sorted (axis=0) = [[0 1 0 2 0] [1 4 5 5 4] [2 4 7 6 9] [2 7 7 6 9] [5 8 9 7 9]] X_sorted (axis=1) = [[0 5 5 8 9] [0 1 6 7 9] [2 2 4 4 5] [2 4 7 7 9] [0 1 6 7 9]]
axis=0 は各列ごとに縦方向に、axis=1 は各行ごとに横方向にソートします。
元の配列のデータをソートする
sort 関数は、配列をソートした新しい ndarray を返却する関数でしたが、元の配列そのものをソートしたい場合があります。
元の配列の値自体をソートしたい場合には、配列(ndarray) に用意されている sort メソッドを使用します。
import numpy as np
x = np.array([5, 2, 4, 6, 1])
print(f'x = {x}')
# 元の配列自体をソートする場合
x.sort()
print(f'x = {x}')【実行結果】 x = [5 2 4 6 1] x = [1 2 4 5 6]
配列(ndarray)のメソッドであるため、numpy.sort 関数とは別のものであることに注意しましょう。
ソート後のインデックスを取得する argsort
どの要素順でソートされているかを取得するには、argsort 関数を使用します。
import numpy as np
x = np.array([5, 2, 4, 6, 1])
print(f'x = {x}')
# ソートした後のインデックス順を取得する
sort_idx = np.argsort(x)
print(f'sort_idx = {sort_idx}')
# ソートされた配列を取得する
print(f'x_sorted = {x[sort_idx]}')【実行結果】 x = [5 2 4 6 1] sort_idx = [4 1 2 0 3] x_sorted = [1 2 4 5 6]
例を見てもわかるように argsort で返却されるのは昇順に並べた際のインデックス番号の配列です。
そのため、ソートした値の配列が取得したければ、返却値を元の配列に指定すればファンシーインデックスによりソートしたデータを取得ができます。このとき取得される配列はビューではなく、新しい配列(コピー)になることに注意しましょう。
まとめ
NumPy の配列(ndarray)をソートする方法について解説しました。
この記事では、ソートした配列を取得する numpy.sort 関数や元の配列自体をソートする numpy.ndarray.sort メソッド、ソート順を返す numpy.argsort 関数の基本的な使い方を紹介しました。
ソートは、よく実施する配列操作であるためしっかりと使い方を覚えてもらえたらと思います。
上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。


の結合方法-_-concatenate-vstack-hstack-_.jpg)

のスライス」と「Python組み込みのlistのスライス」の違い-1.jpg)

の属性情報の確認方法-_-dtype-size-shape-ndim-itemsize-nbytes-_.jpg)
の形状を変更する方法-_-reshape-_.jpg)