网格数据的插值

时间:2019-03-04 21:23:50

标签: python python-3.x scipy interpolation

我希望有人可以帮助我解决我遇到的问题(我对python还是很陌生)。我一直在尝试插值50x4数组的数据,该数组是从下面的excel工作表中读取的。

 [ 60.      0.     23.88   22.38 ]  
 [ 60.      5.     19.508  28.2  ]  
 [ 60.     10.     16.9    32.23 ]  
 [ 60.     15.     15.4    34.03 ]  
 [ 60.     20.     14.4    35.12 ]  
 [ 60.     25.     13.66   36.02 ]  
 [ 60.     30.     13.14   36.61 ]  
 [ 60.     35.     12.69   37.14 ]  
 [ 60.     40.     12.53   37.56 ]  
 [ 60.     50.     12.33   38.32 ]  
 [ 70.      0.     19.3    21.34 ]  
 [ 70.      5.     16.06   25.37 ]  
 [ 70.     10.     13.74   28.08 ]  
 [ 70.     15.     12.33   40.07 ]  
 [ 70.     20.     11.45   41.78 ]  
 [ 70.     25.     10.77   42.8  ]

等...

我想要实现的是在第1列和第2列中输入对应于插值的2个值(例如65和12),它将返回第3列和第4列的插值。它使用matlab中的griddata函数工作。但是python还没有运气。

预先感谢

1 个答案:

答案 0 :(得分:2)

我认为scipy.interpolate可能与MATLAB的Griddata相同(或至少相似)。下面的代码使用径向基函数进行插值。我仅以第3列为z轴作为示例。

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.array([60] * 10 + [70] * 6)
y = np.array([0,5,10,15,20,25,30,35,40,50,0,5,10,15,20,25])
z = np.array([23.88, 19.508, 16.9, 15.4, 14.4, 13.66, 13.14, 12.69, 12.53, 12.33, 19.3, 16.06, 13.74, 12.33, 11.45, 10.77])
x_ticks = np.linspace(60, 70, 11)
y_ticks = np.linspace(0, 50, 51)    
XI, YI = np.meshgrid(x_ticks, y_ticks)

rbf = interpolate.Rbf(x, y, z, epsilon=2)
ZI = rbf(XI, YI)
print(ZI[np.argwhere(y_ticks==12)[0][0], np.argwhere(x_ticks==65)[0][0]])

>>> 14.222288614849171

请注意,结果是ZI[y,x],而不是ZI[x,y]。另外请注意,您的报价必须包含您查询的x和y值,否则会出现IndexError。

也许您可以根据需要建立该解决方案。