NumPyの配列(ndarray)の形状を変更する方法を解説します。
Contents
配列(ndarray)の形状を変更する方法 ~ reshape ~
NumPyの配列(ndarray)の形状を変更する場合には、reshapeメソッドを使用します。
1次元配列から多次元配列を作成する
reshapeを使用する例としてよく見るケースは、1次元配列をまず作成して、その後2次元配列などの多次元配列に変換する場合です。
1次元の配列から2次元配列をreshapeを使って作成する場合には以下のようにします。
import numpy as np x = np.arange(1, 10).reshape((3, 3)) print(x) print(f'size: {x.size}') print(f'shape: {x.shape}')
【実行結果】 [[1 2 3] [4 5 6] [7 8 9]] size: 9 shape: (3, 3)
reshapeの引数には形状(shape)をタプルで指定します。上記の例では(3, 3)のような形で指定することで$3\times3$の配列を作成します。
3次元配列を作成する場合も同様で以下のようにします。
import numpy as np x = np.arange(1, 28).reshape((3, 3, 3)) print(x) print(f'size: {x.size}') print(f'shape: {x.shape}')
【実行結果】 [[[ 1 2 3] [ 4 5 6] [ 7 8 9]] [[10 11 12] [13 14 15] [16 17 18]] [[19 20 21] [22 23 24] [25 26 27]]] size: 27 shape: (3, 3, 3)
この例では、$3\times3\time3$の3次元配列になります。$n$次元になっても同様ですが表示しても分かりにくいので3次元までにしておきます。
reshapeの注意点は「変換元の配列のサイズと変換後の配列のサイズは一致している必要がある」ことです。ここで言っているサイズは、ndarrayの属性であるsizeで取得できる値のことになります。
行ベクトルを作成する
配列の形状を変更したい場合の一つとして、行ベクトルを作成する場合があります。この際には、reshapeを使用するの方法とnp.newaxisを使用する2種類の方法があります。
reshapeを使用する方法
reshapeを用いて行ベクトルを作成する場合には、以下の例のように引数に(1, size)を指定します。ここでのsizeは元の入力配列のサイズです。
import numpy as np x = np.array([1, 2, 3, 4, 5]) print(f'x = {x}') # 行ベクトルを作成する x_row = x.reshape((1, x.size)) print(f'x_row = {x_row}')
【実行結果】 x = [1 2 3 4 5] x_row = [[1 2 3 4 5]]
np.newaxisを使用する方法
reshapeを使用しない方法として、np.newaxisを使用する方法があります。その場合には、x[np.newaxis, :]のように指定します。ここでxは元の入力配列です。
import numpy as np x = np.array([1, 2, 3, 4, 5]) print(f'x = {x}') # 行ベクトルを作成する x_row = x[np.newaxis, :] print(f'x_row = {x_row}')
【実行結果】 x = [1 2 3 4 5] x_row = [[1 2 3 4 5]]
列ベクトルを作成する
配列の形状を変更したい場合の一つとして、列ベクトルを作成する場合があります。この際には、reshapeを使用するの方法とnp.newaxisを使用する2種類の方法があります。
reshapeを使用する方法
reshapeを用いて列ベクトルを作成する場合には、以下の例のように引数に(size, 1)を指定します。ここでのsizeは元の入力配列のサイズです。
import numpy as np x = np.array([1, 2, 3, 4, 5]) print(f'x = {x}') # 列ベクトルを作成する x_col = x.reshape((x.size, 1)) print(f'x_col = \n{x_col}')
【実行結果】 x = [1 2 3 4 5] x_col = [[1] [2] [3] [4] [5]]
np.newaxisを使用する方法
reshapeを使用しない方法として、np.newaxisを使用する方法があります。その場合には、x[:, np.newaxis]のように指定します。ここでxは元の入力配列です。
import numpy as np x = np.array([1, 2, 3, 4, 5]) print(f'x = {x}') # 列ベクトルを作成する x_col = x[:, np.newaxis] print(f'x_col = \n{x_col}')
【実行結果】 x = [1 2 3 4 5] x_col = [[1] [2] [3] [4] [5]]
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。