##1次元配列 → 多次元配列
reshape()メソッドを用いて各次元の要素数を指定することにより、1次元配列を任意の次元の配列に変換できます。配列の構造が分かっていない場合は、事前にshapeプロパティを用いて各次元の要素数を確認すれば良いでしょう。
以下の例では、$\begin{bmatrix}
1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \
\end{bmatrix}$ を $\begin{bmatrix}
1 & 2 & 3 & 4 \
5 & 6 & 7 & 8 \
\end{bmatrix}$ に変換しています。
import numpy as np
data_1 = np.array([1,2,3,4,5,6,7,8])
print(data_1)
print(data_1.shape)
data_2 = data_1.reshape(2, 4)
print(data_2)
最初から $\begin{bmatrix}
1 & 2 & 3 & 4 \
5 & 6 & 7 & 8 \
\end{bmatrix}$ を作りたいのであれば、以下のとおり1行で作ることもできます。
data = np.array([1,2,3,4,5,6,7,8]).reshape(2,4)
print(data)
##多次元配列 → 1次元配列
多次元配列を1次元配列に変換したい場合はいくつか方法があります。
ravel() と flatten()
ravel() と flatten()はいずれも配列を1次元に平滑化(flatten)します。
flatten()を用いた場合は、新しくメモリを使用して配列を新規作成して返り値とします。そのため、返り値の配列の要素を更新した場合も、元の配列の要素は変わりません。
ravel()を用いた場合は、元の配列の形状を直接変更するため、処理速度が速いです。しかし元の配列の要素をそのまま残すことはできません。
data = np.array([[1,2,3,4],[5,6,7,8]])
print(data.ravel())
print(data.flatten())
###reshape()
勿論、reshape()を用いることもできます。
data = np.array([[1,2,3,4],[5,6,7,8]])
print(data.reshape(-1))
-1を使うと、指定した要素数以外は勝手に調節した配列に整形されます。以下では、4行2列の行列に整形しています。
data = np.array([[1,2,3,4],[5,6,7,8]])
print(data.reshape(4,-1))
###多次元配列への応用
上記の方法を用いると、$(a, b, c, d)$ の形状の4次元配列 $X$ について、$(bcd, a)$ の形状に変更したい場合、以下のような方法で変更できます。
X = X.reshape(X.shape[0], -1).T # X.T: the transpose of X