2

相互相関ルーチンとして、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配列をメモリ内のストライドに一致させることができますか?

4

2 に答える 2

2

np.copyコピーされた配列のメモリ レイアウトを制御するorderkwarg を指定できます。Cの連続した配列が必要なようですので、次のようにします。

temp2 = np.copy(temp, order='C')

orderあるいは、np.copy 関数の のデフォルト値は ですが'K'、対応するメソッドの はndarrayであるという事実に頼ることもできる'C'ので、これも機能します。

temp2 = temp.copy()

もちろん、「明示的は暗黙的よりも優れています」など、そのため、メソッドを使用する場合でも、必要なものを明示的に要求する方がはるかに優れています。

temp2 = temp.copy(order='C')

いくつかの偽のデータなので、それが機能することを確認してください:

In [36]: a = np.random.randint(256, size=(2048, 2048)).astype(np.uint8)

In [37]: a.strides
Out[37]: (2048, 1)

In [38]: np.rot90(a, k=-1).strides
Out[38]: (1, -2048)
# The method default works...
In [39]: np.rot90(a, k=-1).copy().strides
Out[39]: (2048, 1)
# ...but explicit is better than implicit
In [40]: np.rot90(a, k=-1).copy(order='C').strides
Out[40]: (2048, 1)
# The function default does not work
In [41]: np.rot90(a, k=-1).copy(order='K').strides
Out[41]: (1, 2048)
于 2015-04-17T13:56:29.073 に答える
2

次のように、メモリ内で強制的に更新できます。

mage=np.random.random((2048,2048))
mage[:] = np.rot90(mage,k=-1)

そのまま保持する必要がある場合mageは、次を使用してメモリ内に別の配列を設定できますzeros_like

mage2=np.zeros_like(mage)
mage2[:] = np.rot90(mage,k=-1)
于 2015-04-17T13:11:34.110 に答える