在3D阵列

时间:2016-11-11 05:22:59

标签: python matlab interpolation

我最近一直在使用Python将内部公司工具从MATLAB移植到Python。

我能够成功地移植其中的大部分内容,但却陷入了困境。对此有任何帮助将非常感激。

在MATLAB中,发生了一个三次插值,其内容如下: z =spline(a,b,c) 其中a = 1x100阵列,b = 2x2x100阵列,c = 1x200阵列。

所以,基本上它试图将100点(包含在b中)的现有2x2数据插入200点(在c中)

MATLAB能够平滑地执行操作,结果z是2x2x200阵列。

我如何在Python中实现相同,因为我无法找到处理3D数组的等效样条函数(我只找到基于一维数组的三维插值,但这些对我的用例没有用)

任何帮助都会受到赞赏,因为我不能深入了解插值技术,以便能够自己在Python中使用自定义方法。

11月15日编辑:

感谢您的评论。由于它是公司内部代码,我无法在这里重现相同。但是,我正在推出一个我想在下面尝试实现的样本:

Matlab代码:

data1=zeros(2,2,5)
set1=zeros(1,5)
set2=zeros(1,10)

 data1(1,1,1)=10
 data1(1,2,1)=11
 data1(2,1,1)=12
 data1(2,2,1)=13
% 
 data1(1,1,2)=10
 data1(1,2,2)=11
 data1(2,1,2)=12
 data1(2,2,2)=13
% 
 data1(1,1,3)=10
 data1(1,2,3)=11
 data1(2,1,3)=12
 data1(2,2,3)=13
% 
 data1(1,1,4)=10
 data1(1,2,4)=11
 data1(2,1,4)=12
 data1(2,2,4)=13

 data1(1,1,5)=10
 data1(1,2,5)=11
 data1(2,1,5)=12
 data1(2,2,5)=13



set1(1,:)=[2,4,6,8,10]
set2(1,:)=[1,2,3,4,5,6,7,8,9,10]

out=spline(set1,data1,set2)

这显示了预期的结果,其中data1是2x2x5数组,其中set1具有1x5值,必须将其内插到具有1x10值的set2中。 结果插值数据out为2x2x10数组。

>> size(data1)
ans =
     2     2     5
>> size(out)
ans =
     2     2    10

但是,我无法复制相同的行为是3D数组的Python(1D数组可以使用单变量样条函数或类似函数)。

上面的Python等效代码是:

#!/user/bin/python

import numpy as np
import scipy
from scipy.interpolate import griddata

data=np.zeros((2,2,5))
set1=[2,4,6,8,10]
set2=[1,2,3,4,5,6,7,8,9,10]

for i in range(0,5):
 data[0,0,i]=10
 data[0,1,i]=11
 data[1,0,i]=12
 data[1,1,i]=13

print data.shape
print data[:,:,1]
print set1
print set2

out1=np.interp(set1,data,set2)
out2=griddata(set1,data,set2,method="cubic")

但是,我尝试运行np.interp或griddata时遇到的错误是:

    Traceback (most recent call last):
    line 22, in <module>
    out=griddata(set1,data,set2,method="cubic")
  File "/user/Python-2.6.6/lib/python2.6/site-packages/scipy/interpolate/ndgriddata.py", line 176, in griddata
    fill_value=fill_value)
  File "/user/Python-2.6.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 274, in __init__
    self._spline = splmake(x,oriented_y,order=order)
  File "/user/Python-2.6.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 771, in splmake
    coefs = func(xk, yk, order, conds, B)
  File "/user/Python-2.6.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 506, in _find_smoothest
    return _dot0(tmp, yk)
  File "/user/Python-2.6.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 480, in _dot0
    return dot(a, b.transpose(axes))
ValueError: objects are not aligned

File "/user/Python_scripts/ECPS_functions_definitions.py", line 958, in trise_check
    out2=np.interp(set1,data,set2)
  File "/user/Python-2.6.6/lib/python2.6/site-packages/numpy/lib/function_base.py", line 1053, in interp
    return compiled_interp(x, xp, fp, left, right)
ValueError: object too deep for desired array

任何能够为三维数组复制MATLAB样条的函数都有助于我继续使用代码(因为这个插值不是代码的主要功能,并且前面的大代码被保留到期这个功能不起作用)

0 个答案:

没有答案
相关问题