相互相関ルーチンとして、2 次元行列 (グレースケール画像) をいくつか取得し、その半分を 90 度回転させて、すべてをフーリエ変換したいと考えています。私は膨大な数のフレームを相互相関させているので、過去に正常に使用したFFTWオブジェクトインターフェイスでpyFFTWを使用しようとしています。
ただし、ここで使用するnumpy.rot90()
と、numpy はメモリ内の配列を物理的に回転させるのではなく、ストライディングを変更するだけであるのに対し、FFTW では物理メモリ内の配列を実際に回転させる必要があるという問題に直面しています。
# Import a 2k x 2k image
mage = my_image_import_function( (2048,2048) )
# mage striding is (16384,8)
temp = np.rot90( mage, k=-1 )
# temp striding is (8, -16384 )
temp2 = np.copy( temp )
# temp2 striding is (8, 16384)
mage2 = np.lib.stride_tricks.as_strided( temp2, (2048,2048), (16384,8) )
# mage2 striding is (16384,8)
pyFFTWobj.update_arrays( mage2, mageFFT )
pyFFTWobj.execute()
を使用.as_strided()
すると元のストライディングが復元されるため、pyFFTW にフィードできます。ただし、.as_strided()
関数を適用すると、mage2
は に対して回転しなくなりmage
ます。は.as_strided()
回転操作を元に戻したので、上記のコードは何もしません。
プログラマーはどうすればnumpy配列をメモリ内のストライドに一致させることができますか?