概要
ndarrayの2次元配列を1次元化して扱いたいとき(たとえば2次元のAxes配列を一括で扱いたいとき)の方法に、reshape()メソッド/関数、flatten()メソッド、ravel()メソッド/関数を使う方法がある。
以下、次の配列を使う。
|
1 2 3 4 5 |
a = np.arange(4).reshape(2, 2) print(a) # [[0 1] # [2 3]] |
ndarrayのメソッド
ndarrayのメソッドのreshape()、flatten()、ravel()を使う。戻り値もndarray。
reshape()メソッド
reshape()メソッドで1次元化する場合、reshape(-1)とする。
|
1 2 3 |
print(a.reshape(-1)) # [0 1 2 3] |
1次元の列ベクトルが必要な場合はreshape(-1, 1)。
|
1 2 3 4 5 6 |
print(a.reshape(-1, 1)) # [[0] # [1] # [2] # [3]] |
reshape(1, -1)とすると1行になるが、次元が2次元であるため、1つの1次元要素配列を要素に持つ2次元配列となってしまう。
|
1 2 3 |
print(a.reshape(1, -1)) # [[0 1 2 3]] |
flatten()メソッド
flatten()メソッドは、reshape(-1)と同じ効果を持つ。
|
1 2 3 |
print(a.flatten()) # [0 1 2 3] |
ravel()メソッド
ravel()メソッドも、reshape(-1)と同じ効果を持つ。
|
1 2 3 |
print(a.ravel()) # [0 1 2 3] |
Numpyの関数
Numpy.reshape()関数、Numpy.ravel()関数は、引数にndarray以外のarray-likeオブジェクトをとることができる。ただし戻り値はndarray。
Numpy.flatten()は定義されていない。
numpy.reshape()関数
numpy.reshape()関数は、第2引数で次元・次数を与える。
|
1 2 3 |
print(np.reshape(b, -1)) # [0 1 2 3] |
2次元にしたい場合は、第2引数をタプルにする。
|
1 2 3 4 5 6 7 8 9 10 |
print(np.reshape(b, (1, -1))) # [[0 1 2 3]] print(np.reshape(b, (-1, 1))) # [[0] # [1] # [2] # [3]] |
numpy.ravel()関数
numpy.ravel()関数の機能はravel()メソッドと同じ。
|
1 2 3 |
print(np.ravel(b)) # [0 1 2 3] |
戻り値のビューとコピーの違い
reshape()とravel()は可能な限りビューを返す(結果の変更がオリジナルに影響を与える)。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
a.reshape(-1)[0] = -1 print(a) # [[-1 1] # [ 2 3]] a[0, 0] = 0 a.ravel()[0] = -1 print(a) # [[-1 1] # [ 2 3]] |
flatten()はコピーを返す(結果の変更はオリジナルに影響しない)。
|
1 2 3 4 5 |
a.flatten()[0] = -1 print(a) # [[0 1] # [2 3]] |