NumPy
前回、PythonのNumPyでndarrayをファイルに保存(np.save)、また読み込みする方法(np.load)を紹介しました。
今回はNumPyで多次元のndarrayやリストを一次元にする方法(.flatten、np.ravel)を紹介します。
それでは始めていきましょう。
.flatten
多次元のndarrayを一次元にする方法の一つとして「.flatten()」があります。
「ndarray.flatten()」とすることでndarrayを一次元化できます。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.flatten())
実行結果
[1 2 3 4 5 6]
ただし通常のリストに対しては使用できません。
import numpy as np
b = [[1, 2, 3], [4, 5, 6]]
print(b.flatten())
実行結果
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[7], line 5
1 import numpy as np
3 b = [[1, 2, 3], [4, 5, 6]]
----> 5 print(b.flatten())
AttributeError: 'list' object has no attribute 'flatten'
三次元のリストでも一度に一次元化できます。
import numpy as np
c = np.array([[[1, 2, 3], [2, 3, 4], [3, 4, 5]],
[[3, 4, 5], [5, 6, 7], [7, 8, 9]],
[[6, 7, 8], [9, 10, 11], [12, 13, 14]]])
print(c.flatten())
実行結果
[ 1 2 3 2 3 4 3 4 5 3 4 5 5 6 7 7 8 9 6 7 8 9 10 11
12 13 14]
np.ravel
多次元のリストを一次元化する方法のもう一つとして「np.ravel()」があります。
こちらは「np.ravel(リスト)」とすることでリストを一次元化します。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(np.ravel(a))
実行結果
[1 2 3 4 5 6]
「np.ravel()」の場合、通常のリストに対しても使うことができます。
import numpy as np
b = [[1, 2, 3], [4, 5, 6]]
print(np.ravel(b))
実行結果
[1 2 3 4 5 6]
もちろん三次元のリストでも一度に一次元化できます。
import numpy as np
c = np.array([[[1, 2, 3], [2, 3, 4], [3, 4, 5]],
[[3, 4, 5], [5, 6, 7], [7, 8, 9]],
[[6, 7, 8], [9, 10, 11], [12, 13, 14]]])
print(np.ravel(c))
実行結果
[ 1 2 3 2 3 4 3 4 5 3 4 5 5 6 7 7 8 9 6 7 8 9 10 11
12 13 14]
.flattenとnp.ravelの違い
「.flatten」と「np.ravel」の違いは先ほど出てきた「.flatten」はndarrayにしかつかえない(通常のリストには使えない)のに対し、「np.ravel」はndarrayにも通常のリストにも使える点です。
またもう一つの違う点としては「.flatten」はコピーを返すのに対し、「np.ravel」はビューを返すという点です。
つまり「np.ravel」で一次元化したリストは元のリストを書き換えると「np.ravel」で一次元化したリストも書き換えられてしまいます。
まず「.flatten」の場合ですが、あるリスト(a)を「.flatten」で一次元化した後、書き換えたとしても一次元化したリストの値は変わりません。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
a_flat = a.flatten()
print(a_flat)
a[1, 1] = 100
print(a_flat)
実行結果
[1 2 3 4 5 6]
[1 2 3 4 5 6]
しかしながら「np.ravel」の場合、あるリスト(a)を「.ravel」で一次元化した後、書き換えると一次元化したリストの値も変わってしまいます。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
a_ravel = np.ravel(a)
print(a_ravel)
a[1, 1] = 100
print(a_ravel)
実行結果
[1 2 3 4 5 6]
[ 1 2 3 4 100 6]
このコピーなのか、ビューなのかは後々エラーを生む原因となるので把握しておくといいでしょう。
個人的には「np.ravel」で値が変わってしまう可能性があるくらいなら「.flatten」を使っておいた方が安全かなと思います。
次回は二つのグラフの一致度を確認する3つの方法を紹介します。
ではでは今回はこんな感じで。
コメント