2016-03-08 74 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'生成一些伪造的数据来将你的描述变成可复制的测试用例吗? –