2015-04-17 67 views
2

對於互相關例程我想採取一些二維矩陣(灰度圖像),旋轉一半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的答案是正確的,原子的就地作品,而我得到的答案信貸海梅,因爲這是一個有點更加明確。 –

回答

2

你可以提供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) 
2

你可以迫使它在內存中來更新這樣的:使用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)