Python 强制numpy数组物理匹配内存中的跨步

Python 强制numpy数组物理匹配内存中的跨步,python,numpy,fftw,stride,Python,Numpy,Fftw,Stride,对于互相关例程,我想获取一些二维矩阵(灰度图像),将其中一半旋转90度,然后对它们进行傅里叶变换。我正在交叉关联大量帧,因此我尝试将pyFFTW与FFTW对象接口一起使用,我在过去成功地使用了该接口 但是,在这里使用numpy.rot90()时,我遇到了这样一个问题:numpy并不是在内存中物理地旋转数组,而是简单地更改跨距,而FFTW要求实际旋转物理内存中的数组 # Import a 2k x 2k image mage = my_image_import_function( (2048,20

对于互相关例程,我想获取一些二维矩阵(灰度图像),将其中一半旋转90度,然后对它们进行傅里叶变换。我正在交叉关联大量帧,因此我尝试将pyFFTW与FFTW对象接口一起使用,我在过去成功地使用了该接口

但是,在这里使用
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_stride()
可恢复原始跨步,以便将其输入pyFFTW。但是,在应用
.as_stride()
功能后,
mage2
不再相对于
mage
旋转。
.as_stride()
已撤消旋转操作,因此上述代码不执行任何操作


程序员如何在物理上强制numpy数组与其在内存中的跨距相匹配?

您可以强制它在内存中进行如下更新:

mage=np.random.random((2048,2048))
mage[:] = np.rot90(mage,k=-1)
如果您需要按原样保留
mage
,您可以使用
zero\u在内存中设置另一个数组,如

mage2=np.zeros_like(mage)
mage2[:] = np.rot90(mage,k=-1)

您可以提供
np.copy
一个
order
kwarg来控制复制阵列的内存布局。您似乎想要一个C连续数组,因此需要执行以下操作:

temp2 = np.copy(temp, order='C')
您也可以依赖这样一个事实,即
np.copy
order
的默认值是
'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)

atom和Jaime的答案都是正确的,atom的答案是正确的,而我的答案是Jaime的,因为它更明确一些。