强制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数组匹配其跨步内存?

+0

两个原子的和Jaime的答案是正确的,原子的就地作品,而我得到的答案信贷海梅,因为这是一个有点更加明确。 –

你可以提供np.copy控制复制阵列的内存布局的order kwarg。你似乎想一个C连续的数组,所以你想做的事:

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

你可以或者依靠事实,而ordernp.copyfunction的默认值是'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)