【NumPy】多次元のndarrayやリストを一次元にする方法(.flatten、np.ravel)[Python]

  • URLをコピーしました!
目次

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つの方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次