2016-03-08 55 views
1

我正在使用NumPy和SciPy將MATLAB程序轉換爲Python程序,我對它仍然很陌生。在計劃的一部分,我有以下的MATLAB代碼:SciPy interp2d內存錯誤,尋找替代品

tImg(:,:,1) = interp2(x,y,Img(:,:,1),Tx,Ty,'cubic'); 

在interp2方法的所有參數都是298x142的兩倍。

所以,我試圖將其轉換爲以下Python代碼:

tImg[:, :, 0] = (scipy.interpolate.interp2d(x, y, img[:, :, 0], kind='cubic'))(Tx, Ty) 

我在interp2d方法給出的MemoryError。 MATLAB代碼運行良好。我已閱讀插值文檔,但似乎找不到解決方案。

我運行上面的代碼與3GB內存,scipy 0.16.0。

任何幫助表示讚賞。謝謝。

回答

2

我懷疑問題是TxTy對MATLAB的interp2函數和scipy.interpolate.interp2d意味着不同的東西。

在MATLAB interp2功能,TxTy將是指定x 2D陣列,y座標每個單獨輸出點,因此,結果將是具有相同的形狀TxTy,即矢量:

timg(i, j, 1) = interp2(x, y, Img(i, j, 1), Tx(i, j),Ty(i, j), 'cubic'); 

scipy.interpolate.interp2dTxTy應該是指定的行和列的x和y座標爲規則網 1D載體在其上插值是進行評估,即:

timg[i, j, 0] = intp(Tx[i], Ty[j]) 

我懷疑你是通過你想在插值點的座標,在這種情況下,你會得到一個(nx*ny, nx*ny)輸出。如果nx = 298ny = 142那麼您將生成一個(42316, 42316)數組。假設它包含64位浮點數,總共需要大約14GB的內存。

+0

感謝您的回答。然而,即使我嘗試不使用Tx和Ty,即'scipy.interpolate.interp2d(x,y,img [:,:0],kind ='立方體')',我仍然會出現內存錯誤。所以我懷疑它與scipy的內部實現有關。因此,我正在尋求一種可以實現相同產出的替代方案。 –

+0

我無法重現您描述的問題。你可以通過展示如何爲'x','y'和'img'生成一些僞造的數據來將你的描述變成可複製的測試用例嗎? –