【发布时间】:2019-12-30 17:29:10
【问题描述】:
我无法理解如何使用 scipy.interpolate.RegularGridInterpolator 对数据进行整形以评估 nD 数组的插值视图
考虑A 一个(n1,n2,n3) 形的numpy 数组,沿以下坐标索引:
x = np.linspace(0, 10, 5) # n1 = 5
y = np.linspace(-1, 1, 10) # n2 = 10
z = np.linspace(0, 500, 1000) # n3 = 1000
对于本示例,您可以使用文档中的这段代码生成A = ex_array:
def f(x,y,z):
return 2 * x**3 + 3 * y**2 - z
ex_array = f(*np.meshgrid(x, y, z, indexing='ij', sparse=True))
假设我想沿每个轴插入整个数组。 这是通过:
from scipy.interpolate import RegularGridInterpolator
interpolated = RegularGridInterpolator((x,y,z), ex_array)
现在,我的大脑开始严重受伤的部分:
为了在任何给定坐标处评估此插值器对象,您必须在所述点上 __call__ 它,如下所示:
evaluated_pts = interpolated((0,1,0)) # evaluate at (x,y,z) = (5,0.5,300)
print(evaluated_pts)
为了在几个点上评估它,你可以这样迭代:
pts = ((5,0.5,_z) for _z in np.linspace(100,200,50))
evaluated_pts = interpolated(pts)
现在,如果我想使用与上述相同的逻辑,并在一个全新的网格上进行评估,例如:
new_x = np.linspace(2, 3, 128)
new_y = np.linspace(-0.1, 0.1, 100)
new_z = np.linspace(350, 400, 256)
正如你现在看到的,它不像interpolated(new_x, new_y, new_z)那么简单,我尝试使用 np.meshgrid 但无法弄清楚。
理想情况下,我想在本例中输出一个新的 (128, 100, 256) 数组。
【问题讨论】:
-
我也有同样的问题。在我看来,
scipy.griddata可用于映射 非结构化 数据,即将点云映射到另一个点云。RGD可以将 结构化 映射到 非结构化。 但是没有任何方法可以从结构化映射到结构化。你能做的最好的就是将一堆点传递给 RGD,这对我来说似乎非常低效。但也许这没什么大不了的:)
标签: python python-3.x scipy interpolation