NumPy配列の行・列を自由自在に並べ替え!インデックス参照とnp.takeを使いこなす
NumPy配列(ndarray)でデータを取り扱う際、特定の分析や可視化の要件に合わせて、行や列の順番を任意に変更したい場面はよくあります。データの並べ替えは、より理解しやすい形式に整えたり、特定の処理に適した形にしたりするために不可欠な操作です。この記事では、NumPy配列の行・列を任意の順番に並べ替えるための主要なテクニックを、具体的なサンプルコードを交えながら詳しく解説します。
NumPy配列の並べ替えの基本
NumPy配列の行や列を並べ替えるには、主に以下の方法を使用します。
-
インデックス配列による直接指定: 最も一般的で柔軟な方法です。
-
np.take()関数: 特定のインデックスに沿って要素を取得する汎用的な関数です。
これらの方法は、元の配列のコピーを作成し、並べ替えた結果を新しい配列として返します。元の配列は変更されません。
インデックス配列による行・列の並べ替え
NumPyのインデックス参照機能は非常に強力で、整数やブール値だけでなく、インデックスのリストや配列を渡すことで、特定の順番で行や列を選択・並べ替えることができます。
1. 行を任意の順番に並べ替える
特定の行を任意の順番で抽出したり、重複させたり、省略したりすることができます。
サンプルコード
import numpy as np
arr_2d = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90],
[100, 110, 120]])
print("元の配列:\n", arr_2d)
# 行の新しい順番を指定するインデックス配列
# 例: 3番目の行、1番目の行、2番目の行の順に並べ替え
new_row_order = np.array([2, 0, 3, 1])
# 指定したインデックス順に行を並べ替え
reordered_rows = arr_2d[new_row_order, :]
print("\n行を任意の順番に並べ替えた配列:\n", reordered_rows)
出力例
元の配列:
[[ 10 20 30]
[ 40 50 60]
[ 70 80 90]
[100 110 120]]
行を任意の順番に並べ替えた配列:
[[ 70 80 90]
[ 10 20 30]
[100 110 120]
[ 40 50 60]]
2. 列を任意の順番に並べ替える
行の並べ替えと同様に、列もインデックス配列を使って並べ替えることができます。
サンプルコード
import numpy as np
arr_2d = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
print("元の配列:\n", arr_2d)
# 列の新しい順番を指定するインデックス配列
# 例: 2番目の列、0番目の列、1番目の列の順に並べ替え
new_col_order = np.array([2, 0, 1])
# 指定したインデックス順に列を並べ替え
reordered_cols = arr_2d[:, new_col_order]
print("\n列を任意の順番に並べ替えた配列:\n", reordered_cols)
出力例
元の配列:
[[10 20 30]
[40 50 60]
[70 80 90]]
列を任意の順番に並べ替えた配列:
[[30 10 20]
[60 40 50]
[90 70 80]]
np.take()関数による並べ替え
np.take()関数は、指定したインデックスと軸に基づいて、配列から要素を抽出(並べ替え)する汎用的な関数です。インデックス参照と同じような操作を、より明示的な形で記述したい場合に便利です。
書式
numpy.take(a, indices, axis=None, out=None, mode='raise')
-
a: 元の配列。 -
indices: 要素を取り出すインデックス配列。 -
axis: 要素を取り出す軸。Noneの場合、配列全体をフラットにしてから取り出します。
1. 行をnp.take()で並べ替える
サンプルコード
import numpy as np
arr_2d = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
print("元の配列:\n", arr_2d)
# 行の新しい順番を指定するインデックス配列
new_row_order = np.array([2, 0, 1])
# axis=0 で行を並べ替え
reordered_rows_take = np.take(arr_2d, new_row_order, axis=0)
print("\nnp.take()で行を並べ替えた配列:\n", reordered_rows_take)
出力例
元の配列:
[[10 20 30]
[40 50 60]
[70 80 90]]
np.take()で行を並べ替えた配列:
[[70 80 90]
[10 20 30]
[40 50 60]]
2. 列をnp.take()で並べ替える
サンプルコード
import numpy as np
arr_2d = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
print("元の配列:\n", arr_2d)
# 列の新しい順番を指定するインデックス配列
new_col_order = np.array([2, 0, 1])
# axis=1 で列を並べ替え
reordered_cols_take = np.take(arr_2d, new_col_order, axis=1)
print("\nnp.take()で列を並べ替えた配列:\n", reordered_cols_take)
出力例
元の配列:
[[10 20 30]
[40 50 60]
[70 80 90]]
np.take()で列を並べ替えた配列:
[[30 10 20]
[60 40 50]
[90 70 80]]
まとめ
NumPy配列の行や列を任意の順番に並べ替える方法は、データハンドリングの基本的ながら非常に重要なスキルです。
-
インデックス配列による直接指定: 最も一般的で、直感的に記述できます。
arr[new_row_order, :]やarr[:, new_col_order]のように使用します。 -
np.take(arr, indices, axis=...): より明示的に軸を指定して要素を取り出したい場合に有効です。
どちらの方法も最終的な結果は同じですが、コードの可読性や個人の好みに合わせて使い分けることができます。これらのテクニックをマスターすることで、NumPyでのデータ操作がさらに効率的かつ柔軟になるでしょう。ぜひ、あなたのデータ分析ワークフローで活用してください!

