2

对于互相关例程,我想获取一些二维矩阵(灰度图像),将其中一半旋转 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_strided()恢复原始步幅,以便可以将其输入 pyFFTW。但是,应用该.as_strided()函数后,mage2不再相对于 旋转mage.as_strided()已经撤消了旋转操作,所以上面的代码什么也不做。

程序员如何在物理上强制一个 numpy 数组匹配它在内存中的步幅?

4

2 回答 2

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 回答
2

您可以提供np.copy一个order控制复制数组的内存布局的 kwarg。你似乎想要一个 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 回答