Scipy对结构化2d数据进行插值,但在非结构化点上求值吗?

时间:2019-03-10 10:59:55

标签: python numpy scipy interpolation

我有以下最小代码,使用scipy.interpolate.interp2d对2d网格数据进行插值。

import numpy as np
from scipy import interpolate
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, kind='cubic')

现在 f 可以用于评估其他点。问题是我要评估的点是完全随机的点,没有形成规则的网格。

# Evaluate at point (x_new, y_new), in total 256*256 points
x_new = np.random.random(256*256)
y_new = np.random.random(256*256)
func(x_new, y_new)

这将在我的PC中导致运行时错误,似乎将x_new和y_new视为网状网格,生成评估矩阵65536x65536,这不是我的目的。

RuntimeError: Cannot produce output of size 65536x65536 (size too large)

一种完成任务的方法是使用代码逐个评估点

z_new = np.array([f(i, j) for i, j in zip(x_new, y_new)])

但是,它 !!!!

%timeit z_new = np.array([f(i, j) for i, j in zip(x_new, y_new)])

1.26 s ± 46.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

  

有没有更快的方法来评估随机点?

这里的更快意味着与下面的时间相当:

x_new = np.random.random(256)
y_new = np.random.random(256)

%timeit f(x_new, y_new)

相同的256 * 256 = 65536个评估,需要在我的PC上进行:

1.21 ms ± 39.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

速度不必达到1.21ms,完全可以接受121ms。

1 个答案:

答案 0 :(得分:0)

您要寻找的功能是mounted

给出一组点(x,y,z),其中x和y在常规网格上定义,它允许您对中间(x,y)点的z值进行采样。您的情况如下所示:

scipy.interpolate.RegularGridInterpolator

有关更多详细信息,请参见https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.interpolate.RegularGridInterpolator.html