NumPyの「reshape」の使い方 – 配列の形状を変更する

NumPyはPython数値計算を行うためのライブラリです。NumPyのreshape関数を使うと、配列の形状を自由に変更できます。この記事では、reshapeの基本的な使い方から、注意点、応用例を解説します。

reshapeとは

reshapeは、NumPy配列の形状(shape)を変更するための関数です。例えば、1次元配列を2次元配列に変換したり、2次元配列を別の形状の2次元配列に変換したりできます。

reshapeの基本的な考え方

  • 元の配列の要素数は変えずに、形状だけを変更する。
  • 新しい形状は、元の配列の要素数と互換性がある必要がある。(要素数が一致する必要がある)

reshapeの基本的な使い方

reshape関数は、np.reshapeまたは配列のメソッドとしてndarray.reshapeの2通りの方法で利用できます。どちらを使っても結果は同じです。

np.reshapeを使う方法

import numpy as np

arr = np.arange(12)  # 0から11までの要素を持つ1次元配列を作成
print("元の配列:", arr)

reshaped_arr = np.reshape(arr, (3, 4))  # 3x4の2次元配列に変形
print("変形後の配列:\n", reshaped_arr)

出力

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

ndarray.reshapeを使う方法

import numpy as np

arr = np.arange(12)  # 0から11までの要素を持つ1次元配列を作成
print("元の配列:", arr)

reshaped_arr = arr.reshape((3, 4))  # 3x4の2次元配列に変形
print("変形後の配列:\n", reshaped_arr)

出力

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

新しい形状の指定方法

reshapeの引数には、新しい形状をタプルまたは整数で指定します。

  • タプルで指定: arr.reshape((3, 4)) のように、(行数, 列数)のタプルで指定。
  • 整数で指定: arr.reshape(3, 4) のように、行数、列数を直接指定。

どちらの方法でも同じ結果が得られます。

reshapeの注意点

素数の互換性

reshapeで形状を変更する際、元の配列の要素数と新しい形状の要素数が一致している必要があります。一致しない場合はエラーが発生します。

import numpy as np

arr = np.arange(12)

# エラーになる例: 要素数が一致しない
# reshaped_arr = arr.reshape((3, 5))  # ValueErrorが発生

メモリの共有

reshapeは、多くの場合、元の配列のデータのコピーを作成せず、新しい形状のビュー(view)を返します。これは、メモリ効率が良い反面、ビューを変更すると元の配列も変更される可能性があることを意味します。

import numpy as np

arr = np.arange(12)
reshaped_arr = arr.reshape((3, 4))

reshaped_arr[0, 0] = 100  # reshaped_arrの要素を変更
print("元の配列:", arr)  # arrも変更されている

出力

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

データのコピーを作成したい場合は、copyメソッドを使用します。

import numpy as np

arr = np.arange(12)
reshaped_arr = arr.reshape((3, 4)).copy()  # コピーを作成

reshaped_arr[0, 0] = 100  # reshaped_arrの要素を変更
print("元の配列:", arr)  # arrは変更されない

出力

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

reshapeの応用

-1を使った次元の自動計算

reshapeの引数に-1を指定すると、NumPyが自動的にその次元のサイズを計算します。これは、特定の次元のサイズを明示的に指定したくない場合に便利です。

import numpy as np

arr = np.arange(12)

# 列数を4に固定し、行数は自動計算
reshaped_arr = arr.reshape((-1, 4))
print(reshaped_arr)

出力

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

-1は、一度のreshapeで一つだけ指定できます。

1次元配列への変換 (flatten)

reshape(-1)を使うと、多次元配列を1次元配列に変換できます。これは、flattenメソッドと同じ結果になります。

import numpy as np

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

# reshape(-1)を使用
flattened_arr = arr.reshape(-1)
print("reshape(-1):", flattened_arr)

# flatten()を使用
flattened_arr_method = arr.flatten()
print("flatten():", flattened_arr_method)

出力

reshape(-1): [1 2 3 4 5 6]
flatten(): [1 2 3 4 5 6]

次元を増やす

reshapeを使って、配列の次元を増やすこともできます。例えば、1次元配列を2次元の行ベクトルや列ベクトルに変換できます。

import numpy as np

arr = np.arange(5)
print("元の配列:", arr)

# 行ベクトルに変換 (1x5)
row_vector = arr.reshape((1, -1))
print("行ベクトル:", row_vector)

# 列ベクトルに変換 (5x1)
column_vector = arr.reshape((-1, 1))
print("列ベクトル:", column_vector)

出力

元の配列: [0 1 2 3 4]
行ベクトル: [[0 1 2 3 4]]
列ベクトル: [[0]
 [1]
 [2]
 [3]
 [4]]

まとめ

NumPyのreshapeは配列の形状を柔軟に変更でき、様々な場面で利用します。 reshapeを活用することで、データ分析や機械学習におけるデータの前処理などが効率的に行えます。

[PR]

現場で使える!NumPyデータ処理入門 機械学習・データサイエンスで役立つ高速処理手法 (AI & TECHNOLOGY) [ 吉田 拓真 ]

RとPythonで学ぶ[実践的]データサイエンス&機械学習【増補改訂版】 [ 有賀友紀、大橋俊介 ]

Pythonプログラミングパーフェクトマスター[最新Visual Studio Code対応 第4版] [ 金城俊哉 ]