『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

numpy.ravel, ndarray.flattenで配列をフラット化する

【NumPy】多次元配列をフラットにする関数

多次元配列をフラットにして(一次元配列にして)返す関数の一覧です。

numpy.ravel()

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

# NUMPY_RAVEL

# In[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() は受け取った配列の見た目を変えるだけで、コピーを作りません。したがって、フラット化された配列の要素を変更すると、もとの多次元配列も影響を受けてしまいます。

# In[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 次元配列を返すメソッドです。

# NUMPY_FLATTEN

# In[1]

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() と同じく高速処理に向いています。

# NDARRAY_RESHAPE

# In[1]

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]

 

コメント