見出し画像

[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)のほうが望ましいとのこと。
具体的にどう望ましいかまでは確認しませんでしたが。

When a view is desired in as many cases as possible, may be preferable.arr.reshape(-1)

https://numpy.org/doc/stable/reference/generated/numpy.ravel.html

まとめ

・flatten()はコピーを返すので、その分のメモリを消費してしまう。ravel()やreshape(-1)を使ったほうが速度が速いらしい。

・「ビュー」でよければravel()やreshape(-1)を使いましょう。

より詳しい情報は以下のサイトにまとまっていました。

いいなと思ったら応援しよう!