1

メモリ マップド配列を使用して、アプリケーションのメモリの問題を処理しようとしています。ただし、計算の一部として、配列の一部の値を 0 に設定する必要があります。残念ながら、配列マスクには追加のメモリが必要です。マスクがきれいに扱われるように、次のことを行う方法はありますか?

source_array = numpy.memmap(filename, dtype='float32', mode='w+', shape=shape)
#Load data into memory mapped numpy array
band.ReadAsArray(buf_obj = source_array)
#set values == 255 to 0
numpy.putmask(source_array, source_array >= 255.0, 0.0)

の最後の行はsource_array >= 255.0、メモリ内に大きな配列を作成する必要があると思いますよね?各要素を手動でループする以外に、255 個の値をすべてsource_array0 に設定するメモリ効率の良いメカニズムはありますか?

4

1 に答える 1

2

もちろん、マスクを memapping することは、ここでは最適な解決策ではないことに気付きました。Numpy には、配列をチャンク単位でループするのに役立つ機能はあまりありません (これが最もクリーンな方法です) が、もちろん手動で行うこともできます。numpy を高速化するために常にチャンクで計算を行うで実際に成功するかもしれませんnumexprが、私はこれを試しませんでした。


これはあなたが望んでいたものではなかったと思います:

out パラメーターを s や他の多くの関数にいつでも使用して、ufuncnumpy に結果をその配列に直接格納するように要求することができます (一般的にメモリを節約するためにも)。これは、空のメモリ マップ配列を作成すると、次のようにできることを意味します。

# You could use tempfile.NamedTemporaryFile. But I will leave that to you:
mask = np.memmap(tempfile, shape=source_array.shape, dtype=bool, mode='w+')
np.greater_equal(source_array, 255.0, out=mask)

そして、mask配列を で使用しputmaskます。これで問題は解決するはずです。

于 2012-10-13T13:14:31.247 に答える