强制numpy阵列在物理上匹配stroping在内存
问题描述:
对于互相关例程我想采取一些二维矩阵(灰度图像),旋转一半90度,傅里叶变换他们全部。我交叉关联了大量的帧,所以我试图在过去成功使用的FFTW对象接口中使用pyFFTW。强制numpy阵列在物理上匹配stroping在内存
但是,这里使用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数组匹配其跨步内存?
答
你可以提供np.copy
控制复制阵列的内存布局的order
kwarg。你似乎想一个C连续的数组,所以你想做的事:
temp2 = np.copy(temp, order='C')
你可以或者依靠事实,而order
为np.copy
function的默认值是'K'
,为ndarray
相应method这是'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)
答
你可以迫使它在内存中来更新这样的:使用zeros_like
mage=np.random.random((2048,2048))
mage[:] = np.rot90(mage,k=-1)
如果您需要保留mage
的是,你可以在内存中建立另一个数组:
mage2=np.zeros_like(mage)
mage2[:] = np.rot90(mage,k=-1)
两个原子的和Jaime的答案是正确的,原子的就地作品,而我得到的答案信贷海梅,因为这是一个有点更加明确。 –