3D插值

3D Interpolation

我尝试更清楚地重新表述我的问题:

我想对我的数据进行 3D 插值,但我找不到好的 scipy 来解决我的问题和正确的处理方法。

假设您处于 3D 笛卡尔坐标 space (x,y,z) 中。 (x,y) ==> (200x200) 平面面向您,您可以看到一些值形成散点图的图形表示。这些值是通过一个模型估算的,该模型查看我的对象在特定波长下的属性。我使用的模型总共只能处理 20 个波长,这是我们的z-axis。因此,如果我们再次采用我的问题的图形表示,你有 20 层图,从一个名为 lambda_min 的值开始,到达第 20 个和最后一个波长:lambda_max。每层地块都由规则的步骤分隔。但是你可以猜到,由于我们生成的模型数量有限(20),我们无法估计间隙之间的值:这就是我的问题的目的。

我们如何为我们的模型未生成的一个或多个特定波长 (z) 插入数据 (y)。我明确指出 x 值采样对于所有模型都是相同的 (x,y) 平面中关于波长的唯一变化参数是物理量的估计 (y)

我的数据排序在一个名为 V 的数组中(根据我使用的数量调用:可见性),形状为 (10,200).

所以当我调用 V[w][k] 时,这给了我一个观点:估计的可见度 (y) 估计给定的 w(= 波长 ==> z)在x-axis(=q 空间频率)上的特定点 k

x-axis 数据(空间频率)单独存储在称为 q 的一维数组中,长度为 200,并且对于所有波长都是相同的。

根据您的问题,您可能遇到了以下问题。如果我错了请纠正我:

x = [1, 2, .., 200]
y = [1, 2, .., 200]
z = [z0, .., z20]

V = V(z, k, y) = V(z, k(x), y)

你说你知道 V 上面给出的所有 xyz。并且知道您想了解实数 y'z',其中 1 < y' < 200z0 < z' < z20.

所以我们感兴趣的是:

res = V(z', k(x), y')

我没听错吗?

如果是这样,我们有一个二维插值问题。获取 scipy.interpolate.interp2d 并为其提供正确的数据。

对于给定的 val_x in [1, 2, .., 200],您执行以下操作:

all_y = np.arange(1, 200 + 1)
all_z = [z0, .., z20]
all_V_x = [[V(z, k(val_x), y) for y in all_y] for z in all_z])

estimate_V_x = scipy.interpolate.interp2d(all_y, all_z, all_V_x, kind='cubic')

现在我们有了一个函数,可以为给定的 val_x 获得 z'y'V 估计值。我们只需要评估它:

res = estimate_V_x(y_new, z_new)

这为我们提供了 V(z', k(x), y') 的结果。

将它们连接在一起:

all_x = np.arange(1, 200 + 1)
all_y = np.arange(1, 200 + 1)
all_z = [z0, .., z20]

def get_V(z, k, y):
    assert z in all_z and y in all_y
    return ... # your computed data goes here
def get_k(x):
    assert x in all_x
    return ... # your computed data goes here

def estimate_V(x, new_y, new_z):
    assert x in all_x
    all_V_x = [[get_V(z, get_k(val_x), y) for y in all_y] for z in all_z])
    estimate_V_x = scipy.interpolate.interp2d(all_y, all_z, all_V_x, kind='cubic')
    return estimate_V_x(new_y, new_z)

注意这里的new_ynew_z也可以是数组,以加快速度。

我不确定我是否做对了,或者这是否有意义。让我知道。

感谢我的一位朋友和@Chris 的回答,我意识到问题不是 3D 而是 2D 问题,然后我尝试再使用一次 scipy.interpolate.interp2d

然后为了估计我想要的特定空间频率下给定波长的 V 值。

f = scipy.interpolate.interp2d(x=q,y=wavel,z=V)

其中

np.shape(q) = (200,)
np.shape(w) = (10,)
np.shape(V) = (10,200)

当我第一次尝试时,我的问题是反转 x 和 y 值,然后错误是由形状错误引起的。但现在我更好地定义了我的问题,然后我们意识到通过反转 x 轴和 y 轴我们现在可以很好地使用这种方法。