NumPy配列の行・列を自由自在に並べ替え!インデックス参照とnp.takeを使いこなす


 

NumPy配列(ndarray)でデータを取り扱う際、特定の分析や可視化の要件に合わせて、行や列の順番を任意に変更したい場面はよくあります。データの並べ替えは、より理解しやすい形式に整えたり、特定の処理に適した形にしたりするために不可欠な操作です。この記事では、NumPy配列の行・列を任意の順番に並べ替えるための主要なテクニックを、具体的なサンプルコードを交えながら詳しく解説します。


 

NumPy配列の並べ替えの基本

 

NumPy配列の行や列を並べ替えるには、主に以下の方法を使用します。

  • インデックス配列による直接指定: 最も一般的で柔軟な方法です。

  • np.take()関数: 特定のインデックスに沿って要素を取得する汎用的な関数です。

これらの方法は、元の配列のコピーを作成し、並べ替えた結果を新しい配列として返します。元の配列は変更されません。


 

インデックス配列による行・列の並べ替え

 

NumPyのインデックス参照機能は非常に強力で、整数やブール値だけでなく、インデックスのリストや配列を渡すことで、特定の順番で行や列を選択・並べ替えることができます。

 

1. 行を任意の順番に並べ替える

 

特定の行を任意の順番で抽出したり、重複させたり、省略したりすることができます。

 

サンプルコード

 

Python
 
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. 列を任意の順番に並べ替える

 

行の並べ替えと同様に、列もインデックス配列を使って並べ替えることができます。

 

サンプルコード

 

Python
 
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()関数は、指定したインデックスと軸に基づいて、配列から要素を抽出(並べ替え)する汎用的な関数です。インデックス参照と同じような操作を、より明示的な形で記述したい場合に便利です。

 

書式

 

Python
 
numpy.take(a, indices, axis=None, out=None, mode='raise')
  • a: 元の配列。

  • indices: 要素を取り出すインデックス配列。

  • axis: 要素を取り出す軸。Noneの場合、配列全体をフラットにしてから取り出します。

 

1. 行をnp.take()で並べ替える

 

 

サンプルコード

 

Python
 
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()で並べ替える

 

 

サンプルコード

 

Python
 
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でのデータ操作がさらに効率的かつ柔軟になるでしょう。ぜひ、あなたのデータ分析ワークフローで活用してください!