配列の形状変換と操作(reshape, transpose, axis指定)

NumPy入門⑧ 配列の形状変換と操作

配列の形状(shape)とは?

NumPy配列は「shape(形状)」という属性を持ち、行数や列数を表します。
形状を理解することは、多次元配列を自在に操作するための基礎となります。

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)   # (2, 3) → 2行3列
print(a.ndim)    # 2 → 次元数

reshapeで形を変える

配列の要素数を変えずに形状を変更するには reshape を使います。

arr = np.arange(12)       # [0 1 2 ... 11]
reshaped = arr.reshape(3, 4)

print(reshaped)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

要素数が合わない形状に変換しようとするとエラーになります。

-1を使った自動計算

reshape に -1 を指定すると、その次元のサイズを自動計算してくれます。

arr = np.arange(12)

print(arr.reshape(2, -1))   # (2, 6) に変換
print(arr.reshape(-1, 3))   # (4, 3) に変換

transposeで転置する

行と列を入れ替える操作は transpose または .T を利用します。

b = np.array([[1, 2, 3], [4, 5, 6]])

print(b.T)
# [[1 4]
#  [2 5]
#  [3 6]]

print(np.transpose(b))  # 同じ結果

axisを指定した操作

NumPyの多くの関数は axis を指定して計算範囲を制御できます。
「どの次元に対して処理を行うか」を決めるために利用されます。

c = np.array([[1, 2, 3],
              [4, 5, 6]])

print(np.sum(c, axis=0))  # 列ごとの合計 → [5 7 9]
print(np.sum(c, axis=1))  # 行ごとの合計 → [ 6 15]
  • axis=0 → 縦方向(列単位の処理)
  • axis=1 → 横方向(行単位の処理)

次元の追加と削除

配列の次元を操作する関数もよく使われます。

arr = np.array([1, 2, 3, 4])

# 次元を追加(1行4列 → 2次元化)
print(arr[np.newaxis, :])  # [[1 2 3 4]]

# 次元を追加(4行1列)
print(arr[:, np.newaxis])
# [[1]
#  [2]
#  [3]
#  [4]]

不要な次元を削除する場合は squeeze を使います。

d = np.array([[[1, 2, 3]]])
print(d.shape)          # (1, 1, 3)

print(np.squeeze(d))    # [1 2 3] (余分な次元を削除)

まとめ

  • reshape で形状を自由に変換できる(-1で自動計算も可能)
  • transpose.T で転置が可能
  • axis を指定すると行ごと・列ごとの演算ができる
  • newaxis で次元を追加、squeeze で不要な次元を削除できる