NumPy

【NumPy】配列(ndarray)をソートする方法 sort、argsort

naoki-hn

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 は各行ごとに横方向にソートします。

numpy.sort の公式ドキュメントはこちらを参照してください。

numpy 関数は、kind 引数でソートアルゴリズムを変更することが可能です。デフォルトは「quicksort」 ですが、他にもアルゴリズムとしては「heapsort」「mergesort」「timsort」が選択できます。

なお、mergesorttimsort は安定ソートであり、安定性が必要な場合に指定されます。特に要求がなければデフォルトのままで問題ありませんが、必要に応じて指定を検討してください。

元の配列のデータをソートする

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 関数とは別のものであることに注意しましょう。

numpy.ndarray.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.argsort 関数の公式ドキュメントはこちらを参照してください。また、ファンシーインデックスについては「ファンシーインデックス(Fancy Indexing)の基本」を参考にしてください。

まとめ

NumPy の配列(ndarray)をソートする方法について解説しました。

この記事では、ソートした配列を取得する numpy.sort 関数や元の配列自体をソートする numpy.ndarray.sort メソッド、ソート順を返す numpy.argsort 関数の基本的な使い方を紹介しました。

ソートは、よく実施する配列操作であるためしっかりと使い方を覚えてもらえたらと思います。

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド

ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました