Python NumPy / ndarray のメソッド #6

株式会社リュディアです。今回も NumPy についてまとめていきます。

前回までの NumPy / ndarray のメソッドについてのまとめへのリンクは以下を参考にしてください。

以下のリンクの内容を元にまとめを作っていきます。

今回も Shape manipulation に分類されるメソッドのまとめです。今回は flatten(), ravel() です。

結論から申し上げると flatten()、ravel() のいずれも多次元のベクトル、行列を1次元 = 1行のベクトルに平坦化するメソッドです。さっそくコードを見てみましょう。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
print(x)

y = x.reshape(3, 4)
print(y)

y_flatten = y.flatten()
y_ravel =y.ravel()

print(y_flatten)
print(y_ravel)

#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#

要素数 12の1行ベクトル x を 3行4列の行列に変形した後、flattern() と ravel() で処理した y_flatten, y_ravel を表示しています。結果はいずれも1行ベクトルに平坦化されていることがわかりますね。何が違うのでしょうか?次の例を見てください。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
print(x)

y = x.reshape(3, 4)
print(y)

y_flatten = y.flatten()
y_ravel =y.ravel()

print(y_flatten)
print(y_ravel)

y_flatten[0] = 100
print(y_flatten)
print(y)

y_ravel[0] = 100
print(y_ravel)
print(y)

#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#
# [100   2   3   4   5   6   7   8   9  10  11  12]
#
# [[ 1  2  3  4] <= 先頭の要素が 1 のまま
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [100   2   3   4   5   6   7   8   9  10  11  12]
#
# [[100   2   3   4] <= 先頭の要素が 100 に書き変わっている
#  [  5   6   7   8]
#  [  9  10  11  12]]
#

実行結果にコメントを入れていますが、flattern() で作られた1行ベクトル y_flatten の先頭要素 y_flatten[0] を 100 に書き換えても元の行列 y の先頭要素 y[0] は書き換えられていません。つまり flatten() で作られた1行ベクトルy_flatten は y のコピー (copy) であるということです。

一方 ravel() で作られた1行ベクトル y_ravel の先頭要素 y_ravel[0] を 100 に書き換えると元の行列 y の先頭要素 y[0] も 100 に書き換えられています。つまり ravel() で作られた1行ベクトル y_ravel はビュー (view) であるということです。

Copy と View については別途、以下のまとめを参考にしてください。

NumPy / ndarray のメソッドに関するまとめの続きは以下からどうぞ。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?