生成可以快速评估的数据点插值

时间:2018-12-17 10:49:58

标签: python interpolation

我有一个函数f(x,y)的值x和y,例如,考虑

x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)

然后我可以通过以下方式插值那些数据点

f = interpolate.interp2d(x, y, z)
f_2 = interpolate.RectBivariateSpline(y, x, z)

这是插值.interp2d文档中所述的示例。

现在我可以轻松地绘制数据了。但是,当您要在数组值输入中评估f或f_2时,将立即遇到问题。详细f(5,[3,4]) 给出与f(5,[4,3])相同的值(因为它在内部排序)并且 f_2(5,[4,3])将给出错误代码,因为未对[4,3]进行排序,因此我们必须在应用f_2之前对输入数据进行排序。

顺便说一句,对于我的应用程序,我只需要在第二个组件中使用多维数组,但是我的问题可能总体上很有趣。

我使用以下方法(“慢速算法”)来解决此问题,并将其与for循环进行比较:

X=np.random.uniform(-5,5,10**4)

1)“简单” For循环遍历

benchmark = []
for i in np.arange(0,len(X)):
    benchmark.extend(f(5,X[i]))

2)不求助于f:

z2 = f(5,X)

3)利用f的结果:

z3 = [x for _,x in sorted(zip(np.argsort(X),f(5,X)))]

Sorting list based on values from another list?

提出了这种求助方式

4)不求助于f:

z4 = f_2(5,np.sort(X))

5)利用f的结果:

z5 = [x for _,x in sorted(zip(np.argsort(X),f_2(5,np.sort(X))[0]))]

需要以下时间:

time needed for benchmark was 0.214368
time needed for z2 was 0.000733 and compared to benchmark 306.983415 times faster
time needed for z3 was 0.011094 and compared to benchmark 20.286991 times faster
time needed for z4 was 0.001289 and compared to benchmark 166.319645 times faster
time needed for z5 was 0.009794 and compared to benchmark 22.979479 times faster

很显然,z2和z4输出错误,因此z5目前是我的最爱,它比for循环快22倍。但是因为z2快306倍,所以我希望有可能改善我的结果。因为我需要对更大的数据集进行多次这种计算,所以对我而言确实很重要。您是否有任何想法可以改进手段或采用更好的数据插值方法?

感谢您的帮助!

0 个答案:

没有答案