基本
配列の形状変更は、reshape()
メソッドで行う。reshape()
メソッドは、元の配列を破壊せず新たな配列を生成する。
具体のいろいろな使い方は、ndarray.reshapeの使い方を参照
以下の例では6個の要素の1次元配列を2×3の2次元配列に変更し、それをさらに3 ×2の2次元配列に変更している。要素は常に行を上から、各行の列要素を左からネストした形で埋めていく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import numpy as np a = np.arange(6) b = a.reshape(2, 3) c = b.reshape(3, 2) print(a) print(b) print(c) # [0 1 2 3 4 5] # [[0 1 2] # [3 4 5]] # [[0 1] # [2 3] # [4 5]] |
暗黙指定
サイズ変更の際、ある次元の要素数を-1とすると、他の要素数に合わせて適切に設定してくれる。
以下の例では2×3×2の3次元配列をつくり、それを3×2×2に変形しているが、2次元目を-1として1次元目と3次元目から設定させている。
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 |
import numpy as np a1 = np.arange(10, 16).reshape(3, 2) a2 = np.arange(20, 26).reshape(3, 2) b = np.array([a1, a2]) print(b.ndim, b.shape) print(b) c = b.reshape(3, -1, 2) print(c) # 3 (2, 3, 2) # [[[10 11] # [12 13] # [14 15]] # # [[20 21] # [22 23] # [24 25]]] # [[[10 11] # [12 13]] # # [[14 15] # [20 21]] # # [[22 23] # [24 25]]] |
この方法は、たとえば行ベクトルの配列を列ベクトルに変換するときに使われる。以下の例では1次元の配列をつくり、それを列ベクトルとするのに、列数を1で固定し、行数を-1として算出させている。
1 2 3 4 5 6 7 8 9 |
import numpy as np a = np.arange(3) b = a.reshape(-1, 1) print(b) # [[0] # [1] # [2]] |
1次元化するときの注意
多次元配列や列ベクトルを1次元化するとき、行数を1、列数を-1で暗黙指定すると求める1次元配列を1つだけ含む2次元の配列になる。こうなってしまのはreshape()
の引数で1行×n列の2次元で指定したため。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import numpy as np a = np.arange(12).reshape(2, 3, 2) print(a) print(a.reshape(1, -1)) # [[[ 0 1] # [ 2 3] # [ 4 5]] # # [[ 6 7] # [ 8 9] # [10 11]]] # [[ 0 1 2 3 4 5 6 7 8 9 10 11]] b = np.arange(3).reshape(-1, 1) print(b) print(b.reshape(1, -1)) # [[0] # [1] # [2]] # [[0 1 2]] |
そこで、size属性で1つの整数だけを指定すると、1次元でその要素数の配列になってくれる。
1 2 3 4 5 6 7 8 9 10 |
import numpy as np a = np.arange(12).reshape(2, 3, 2) print(a.reshape(a.size)) b = np.arange(3).reshape(-1, 1) print(b.reshape(b.size)) # [ 0 1 2 3 4 5 6 7 8 9 10 11] # [0 1 2] |
さらには、引数を-1のみで指定すると、配列のサイズを適当に持ってきて適用してくれる。
1 2 3 4 5 6 7 8 9 10 |
import numpy as np a = np.arange(12).reshape(2, 3, 2) print(a.reshape(-1)) b = np.arange(3).reshape(-1, 1) print(b.reshape(-1)) # [ 0 1 2 3 4 5 6 7 8 9 10 11] # [0 1 2] |
これは列ベクトルを行ベクトル化するときのほか、pyplotで複数のAxesインスタンスを行×列の形で受け取った時に、全てのインスタンスに同じ設定を適用したいときなどに1次元化してループで回す、といったようなことにも使える。