11
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[NumPy基礎] 1次元配列 ⇔ 多次元配列

Last updated at Posted at 2019-09-11

##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
11
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?