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

2024-06-16 13:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

对于互相关程序,我想取一些二维矩阵(灰度图像),将其中一半旋转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数组与其在内存中的跨步匹配?在


Tags: 内存numpyisasnp物理矩阵数组
2条回答

您可以提供np.copy一个orderkwarg来控制复制数组的内存布局。您似乎需要一个C连续数组,因此您需要:

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

您也可以依赖这样一个事实,虽然np.copyfunctionorder的默认值是'K',而{}对应的method是{},因此这也可以:

^{pr2}$

当然,“显式比隐式好”诸如此类,因此,即使您使用该方法,显式地要求您想要的东西要好得多:

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)

您可以这样强制它在内存中更新:

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

如果需要保留mage,可以使用zeros_like在内存中设置另一个数组:

^{pr2}$

相关问题 更多 >