二维插值问题

时间:2009-12-29 23:00:25

标签: python scipy

我在x和y轴上有数据,输出在z

例如

y = 10
x = [1,2,3,4,5,6]
z = [2.3,3.4,5.6,7.8,9.6,11.2]

y = 20 
x = [1,2,3,4,5,6]
z = [4.3,5.4,7.6,9.8,11.6,13.2]

y = 30 
x = [1,2,3,4,5,6]
z = [6.3,7.4,8.6,10.8,13.6,15.2]

当y = 15 x = 3.5

时,如何找到z的值

我试图使用scipy,但我很陌生

非常感谢您的帮助

vibhor

3 个答案:

答案 0 :(得分:4)

scipy.interpolate.bisplrep

参考: http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.bisplrep.html

import scipy
import math
import numpy
from scipy import interpolate


x= [1,2,3,4,5,6]
y= [10,20,30]

Y = numpy.array([[i]*len(x) for i in y])
X = numpy.array([x for i in y])
Z = numpy.array([[2.3,3.4,5.6,7.8,9.6,11.2],
                 [4.3,5.4,7.6,9.8,11.6,13.2],
                 [6.3,7.4,8.6,10.8,13.6,15.2]]) 

tck = interpolate.bisplrep(X,Y,Z)
print interpolate.bisplev(3.5,15,tck) 


7.84921875

修改

上层解决方案并不能让您完美契合。 检查

print interpolate.bisplev(x,y,tck)

[[  2.2531746    4.2531746    6.39603175]
 [  3.54126984   5.54126984   7.11269841]
 [  5.5031746    7.5031746    8.78888889]
 [  7.71111111   9.71111111  10.9968254 ]
 [  9.73730159  11.73730159  13.30873016]
 [ 11.15396825  13.15396825  15.2968254 ]]

克服x和5度方向的第5度的插值白色多项式

tck = interpolate.bisplrep(X,Y,Z,kx=5,ky=2)
print interpolate.bisplev(x,y,tck) 

[[  2.3   4.3   6.3]
 [  3.4   5.4   7.4]
 [  5.6   7.6   8.6]
 [  7.8   9.8  10.8]
 [  9.6  11.6  13.6]
 [ 11.2  13.2  15.2]]

此产量

print interpolate.bisplev(3.5,15,tck)

7.88671875

<强>绘制:
参考http://matplotlib.sourceforge.net/examples/mplot3d/surface3d_demo.html

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z,rstride=1, cstride=1, cmap=cm.jet)
plt.show()

答案 1 :(得分:1)

给定(不是Python代码,因为第二个赋值会在每种情况下消除第一个,当然; - ):

y = 10
x = [1,2,3,4,5,6]
z = [2.3,3.4,5.6,7.8,9.6,11.2]

y = 20 
x = [1,2,3,4,5,6]
z = [4.3,5.4,7.6,9.8,11.6,13.2]

你问:“当y = 15 x = 3.5”时,我如何找到z的值?

由于您正在查看给定“网格”中x和y两者中的等距点,因此您只需获取网格值之间的中点(如果您的值不等距,则采用比例中点,见后面)。因此,对于y = 10,x 3和4的z值分别为5.6和7.8,因此对于x 3.5,您估计它们的中点为6.7;并且类似地,对于y = 20,您估计7.6和9.8之间的中点,即8.7。最后,由于y = 15,因此6.7和8.7之间的中点是z的最终插值:7.7。

假设你有y = 13而x = 3.8。然后对于x,您将采用80%的值,即:

  • 对于y = 10,0.2 * 5.6 + 0.8 * 7.8 - > 7.36

  • 对于y = 20,0.2 * 7.6 + 0.8 * 9.8 - > 9.46

现在你想要z之间的30%,0.3 * 7.36 + 0.7 * 9.46 - &gt; 8.83,那是z。

这是线性插值,它非常简单。您想手动计算它,还是找到为您执行此操作的例程(例如将numpy数组作为“网格”)?即使在后一种情况下,我希望这种“手动”解释(显示你在最基本的算术术语中所做的事情)可以帮助你理解你在做什么......; - )。

当然还有更高级的插值形式 - 你需要那些,还是线性插值足以满足你的用例?

答案 2 :(得分:0)

我想说的只是取其周围值的平均值。因此,如果你需要X = 3.5和Y = 15(3.5,15),你平均(3,10),(3,20),(4,10)和(4,20)。由于我不知道你正在处理什么数据,我不确定确切的接近度是否重要 - 在这种情况下你可以坚持平均值 - 或者如果你需要做某种反距离加权。