我希望有人可以帮助我解决我遇到的问题(我对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还没有运气。
预先感谢
答案 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。
也许您可以根据需要建立该解决方案。