NumPy配列の転置:行と列を入れ替える.T、transpose()、swapaxes()


 


データ分析や機械学習において、NumPy配列の**行と列を入れ替える(転置する)**操作は頻繁に行われます。これは、データの向きを変えて特定の計算に適応させたり、異なるライブラリやモデルの入力形式に合わせたりするために不可欠な操作です。NumPyでは、この転置を行うためのいくつかの便利な方法が提供されています。

この記事では、NumPy配列の転置を行う代表的な方法である .T 属性transpose() メソッド、そして swapaxes() メソッド の使い方を、それぞれの特徴とともに短いコード例で解説します。


 

NumPy配列の転置とは?

 

転置とは、配列の軸(次元)を入れ替える操作のことです。最も一般的なのは、2次元配列の「行」と「列」を入れ替える操作で、数学的には行列の転置と呼ばれます。

例えば、以下のような2行3列の配列があったとします。

[[1, 2, 3],
 [4, 5, 6]]

これを転置すると、3行2列の配列になります。

[[1, 4],
 [2, 5],
 [3, 6]]

 

NumPy配列を転置する方法

 

 

1. .T 属性 (最も簡単!)

 

2次元配列の転置には、.T 属性を使うのが最もシンプルで推奨される方法です。これは、配列のメソッドではなく属性として提供されています。

Python
 
import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(f"元の配列:\n{arr}\n")
print(f"元の形状: {arr.shape}\n") # (2, 3)

# .T 属性で転置
transposed_arr = arr.T
print(f"転置後の配列 (.T):\n{transposed_arr}\n")
print(f"転置後の形状: {transposed_arr.shape}") # (3, 2)

実行結果:

元の配列:
[[1 2 3]
 [4 5 6]]

元の形状: (2, 3)

転置後の配列 (.T):
[[1 4]
 [2 5]
 [3 6]]

転置後の形状: (3, 2)

.T は多次元配列(3次元以上)にも適用可能で、その場合も軸の順番が逆になります(例: (A, B, C)(C, B, A))。

 

2. transpose() メソッド (柔軟な軸の入れ替え)

 

transpose() メソッドは、軸の入れ替え順序を明示的に指定できるため、より複雑な多次元配列の転置に非常に強力です。引数に、新しい軸の順番をタプルで渡します。

Python
 
import numpy as np

arr_3d = np.arange(24).reshape(2, 3, 4) # 2x3x4の3次元配列
print(f"元の3次元配列:\n{arr_3d}\n")
print(f"元の形状: {arr_3d.shape}\n") # (2, 3, 4)

# 軸の順番を (0, 1, 2) から (1, 0, 2) に入れ替える
# 例: 奥行きと行を入れ替える
transposed_3d = arr_3d.transpose((1, 0, 2))
print(f"transpose((1, 0, 2)) で転置:\n{transposed_3d}\n")
print(f"新しい形状: {transposed_3d.shape}") # (3, 2, 4)

実行結果:

元の3次元配列:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

元の形状: (2, 3, 4)

transpose((1, 0, 2)) で転置:
[[[ 0  1  2  3]
  [12 13 14 15]]

 [[ 4  5  6  7]
  [16 17 18 19]]

 [[ 8  9 10 11]
  [20 21 22 23]]]

新しい形状: (3, 2, 4)

2次元配列の場合、arr.transpose()arr.T と同じ結果になります。

 

3. swapaxes() メソッド (2つの軸を入れ替え)

 

swapaxes() メソッドは、指定した2つの軸だけを入れ替える場合に特化しています。これも多次元配列で役立ちます。

Python
 
import numpy as np

arr_3d = np.arange(24).reshape(2, 3, 4)
print(f"元の3次元配列:\n{arr_3d}\n")
print(f"元の形状: {arr_3d.shape}\n") # (2, 3, 4)

# 軸0と軸1を入れ替える
swapped_3d = arr_3d.swapaxes(0, 1)
print(f"swapaxes(0, 1) で軸を入れ替え:\n{swapped_3d}\n")
print(f"新しい形状: {swapped_3d.shape}") # (3, 2, 4)

実行結果:

元の3次元配列:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

元の形状: (2, 3, 4)

swapaxes(0, 1) で軸を入れ替え:
[[[ 0  1  2  3]
  [12 13 14 15]]

 [[ 4  5  6  7]
  [16 17 18 19]]

 [[ 8  9 10 11]
  [20 21 22 23]]]

新しい形状: (3, 2, 4)

swapaxes(0, 1) は、上記の transpose((1, 0, 2)) と同じ結果になります。


 

どの転置方法を選ぶべきか?

 

  • 2次元配列の行と列をシンプルに入れ替えたい場合: .T 属性が最も簡潔で分かりやすいのでおすすめです。

  • 多次元配列で特定の2つの軸だけを入れ替えたい場合: swapaxes() が直感的です。

  • 多次元配列で複数の軸を複雑な順序で入れ替えたい場合: transpose() が最も柔軟で、あらゆる軸の並べ替えに対応できます。

これらの転置操作は、NumPyを使ったデータ処理において非常に基本的ながら強力な機能です。適切に使いこなすことで、より効率的で柔軟なプログラミングが可能になります。