我最近一直在使用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样条的函数都有助于我继续使用代码(因为这个插值不是代码的主要功能,并且前面的大代码被保留到期这个功能不起作用)