[Python]numpyで多次元配列を平坦化(一次元化)する方法をごく簡単に整理
ravel()メソッドによる平坦化
「ビュー」を返します。
ビューは「一方のオブジェクト」が変更されるともう一方のオブジェクトも変更されます。
import numpy as np
z = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
b = z.ravel()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
b[0] = 5
z
array([[ 5, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
flatten()メソッドによる平坦化
「コピー」を返します。
コピーは「一方のオブジェクト」が変更されても、もう一方のオブジェクトは変更されません。
import numpy as np
z = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
b = z.flatten()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
b[0] = 5
z
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
reshape(-1)メソッドのよる平坦化
reshape(-1)はravel()と同様に、「ビュー」を返します。ravel()との違いですが、numpyの公式サイトによると確実にビューを返してほしいとき?はreshape(-1)のほうが望ましいとのこと。
具体的にどう望ましいかまでは確認しませんでしたが。
まとめ
・flatten()はコピーを返すので、その分のメモリを消費してしまう。ravel()やreshape(-1)を使ったほうが速度が速いらしい。
・「ビュー」でよければravel()やreshape(-1)を使いましょう。
より詳しい情報は以下のサイトにまとまっていました。