[NumPy] 多次元配列のフラット化

[NumPy] 多次元配列のフラット化

numpy.ravel()

 numpy.ravel() は受け取った多次元配列を フラット にして 1 次元配列を返します。

# リストFLT01-1

import numpy as np

# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
x = np.arange(1, 10).reshape(3, 3)

# xをフラットにする
rv_x = np.ravel(x)

print(rv_x)
[1 2 3 4 5 6 7 8 9]

 numpy.ravel() は受け取った配列の見た目を変えるだけで、コピーを作りません。
 したがって、フラット化された配列の要素を変更すると、もとの多次元配列も影響を受けてしまいます。

# リストFLT01-2

# フラット化された配列のインデックス0の要素を変更
rv_x[0] = 99

# もとの多次元配列xを表示
print(x)
[[99  2  3]
 [ 4  5  6]
 [ 7  8  9]]

 numpy.ravel() はコピーを作らないので、後述するメソッド ndarray.flatten() よりも高速処理できるという利点がありますが、その代わりに書き換えのリスクを伴います。
 

ndarray.flatten()

 ndarray.flatten() は多次元配列をフラット化して 1 次元配列を返すメソッドです。

# リストFLT02

import numpy as np

# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
y = np.arange(1, 10).reshape(3, 3)

# yをフラットにする
flat_y = y.flatten()

print(flat_y)
[1 2 3 4 5 6 7 8 9]

 numpy.ravel() がビューを生成するのに対して、ndarray.flatten() はコピーを作るので処理速度で劣ります。
 

ndarray.reshape(-1)

 ndarray.reshape() に -1 を渡すと多次元配列がフラット化されます。
 NumPy のコードでは最もよく使われる方法です。このメソッドはビューを生成するので、numpy.ravel() と同じく高速処理に向いています。

# リストFLT03

import numpy as np

# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
z = np.arange(1, 10).reshape(3, 3)

# yをフラットにする
flat_z = z.reshape(-1)

print(flat_z)
[1 2 3 4 5 6 7 8 9]