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
上面给出的所有 x
、y
和 z
。并且知道您想了解实数 y'
和 z'
,其中 1 < y' < 200
和 z0 < 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_y
和new_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 轴我们现在可以很好地使用这种方法。
我尝试更清楚地重新表述我的问题:
我想对我的数据进行 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
上面给出的所有 x
、y
和 z
。并且知道您想了解实数 y'
和 z'
,其中 1 < y' < 200
和 z0 < 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_y
和new_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 轴我们现在可以很好地使用这种方法。