1

フーリエ変換の計算用に設計された私の Python コードでは、タスクを完了できません。

  def fouriertransform(result):     #function for FTM computation
    for filename in glob.iglob('*.tif'):
     imgfourier = scipy.misc.imread(filename, flatten = True)
     image = np.array([imgfourier])#make an array as np
     arr = np.abs(np.fft.fftshift(np.fft.fft2(image)))**2
      with open('сomput.csv', 'wb') as csvfile:
       for elem in arr.flat[:50]:
       writer = csv.writer(csvfile, .....)
       writer.writerow([('{}\t'.format(elem))])

トレースバック (最新の呼び出しが最後):

  File "C:\Python27\lib\site-packages\numpy\fft\fftpack.py", line 524, in _raw_fftnd
  a = function(a, n=s[ii], axis=axes[ii])
  File "C:\Python27\lib\site-packages\numpy\fft\fftpack.py", line 164, in fft
  return _raw_fft(a, n, axis, fftpack.cffti, fftpack.cfftf, _fft_cache)
  File "C:\Python27\lib\site-packages\numpy\fft\fftpack.py", line 75, in _raw_fft
  r = work_function(a, wsave)

メモリエラー

画像が 90 MB と大きく、1 ~ 5 MB の画像で動作する場合、どうすれば問題を解決できますか?

ありがとうございました

4

1 に答える 1

1

いくつかの提案:

  • scipy.fftpack関数を使用すると、入力配列 ( ) を上書きするオプションを使用できます。これoverwrite_x=Trueにより、メモリを節約できます。

  • FFTW C ライブラリの単なる Python ラッパーであるanfft(または新しいpyFFTW ) を試すこともできます。numpy や scipy の FFT 関数よりも間違いなくはるかに高速であり、少なくとも私の手では、メモリ効率も少し向上しているようです。

  • 配列をより低いビット深度にキャストできますか (float64->float32、uint16->uint8)?

  • いつでも最初に画像をダウンサンプリングできます (例: を使用scipy.ndimage.zoom)。画像の空間解像度を下げると、もちろんFFTのスペクトル解像度が低下しますが、正確に何をしたいかによっては、それほど問題にならない場合があります。

  • 追加の RAM を購入しますか?

于 2013-07-04T01:54:04.310 に答える