次の違いは何でしょうか?
>>> import numpy as np
>>> arr = np.array([[[ 0, 1, 2],
... [ 10, 12, 13]],
... [[100, 101, 102],
... [110, 112, 113]]])
>>> arr
array([[[ 0, 1, 2],
[ 10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
>>> arr.ravel()
array([ 0, 1, 2, 10, 12, 13, 100, 101, 102, 110, 112, 113])
>>> arr.ravel()[0] = -1
>>> arr
array([[[ -1, 1, 2],
[ 10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
>>> list(arr.flat)
[-1, 1, 2, 10, 12, 13, 100, 101, 102, 110, 112, 113]
>>> arr.flat[0] = 99
>>> arr
array([[[ 99, 1, 2],
[ 10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
flat
がリストの代わりに反復子を返すという事実を除けば、どちらも元の配列をその場で変更するので、これらは同じように見えます (これは、配列のコピーを返す とは対照的です)。では、とflatten()
の間には他に何か重要な違いがあるのでしょうか。もしない場合、どちらか一方を他方の代わりに使用すると便利なのはどのような場合でしょうか。flat
ravel()
ベストアンサー1
flat
はイテレータです。これは、インデックスを介して配列要素にアクセスできる別のオブジェクトです。主な目的は、ループと理解式で使用することです。これが与える順序は、通常 から得られる順序と同じですravel
。
の結果とは異なりravel
、flat
は ではないndarray
ため、配列のインデックス付けと反復処理以外にできることはあまりありません。list
反復子のコンテンツを表示するには、 を呼び出す必要があることに注意してください。たとえば、arr.flat.min()
では失敗しますAttributeError
が、 では とarr.ravel().min()
同じ結果になりますarr.min()
。
numpy
は、明示的なループを記述する必要のない操作を多数提供するため、ndarray.flat
や一般的な反復子は、 に比べてほとんど使用されませんndarray.ravel()
。
そうは言っても、反復子が望ましい状況もあります。配列が十分に大きく、すべての要素を 1 つずつ検査しようとしている場合は、反復子が適しています。これは、部分的に読み込まれるメモリ マップ配列のようなものがある場合に特に当てはまります。