【问题标题】:Evaluate a RegularGridInterpolator on an another regular grid在另一个规则网格上评估一个 RegularGridInterpolator
【发布时间】: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


【解决方案1】:

RegularGridInterpolator 输入值位于网格上。网格点是使用沿每个轴的“刻度”元组定义的,例如 ((x0, x1, ..., xn), (y0, y1, ..., xm), (z0, z1, .. ., zk) ) 3D。在这种情况下,这些值作为形状 (n, m, k) 的 nd 数组给出。

要评估插值函数,不再需要点位于网格上的假设。然后,要求的点被定义为一个点列表(实际上是一个坐标数组): ((x1, y1, z1), (x2, y2, z2), ... (xP, yP, zP)) 即nd-array of shape(点数,维数)。

要评估新网格上的插值,必须使用meshgrid 构造它。

reshapetranspose 用于将数组从一种形状转换为另一种形状(请参阅this question)。

例如:

x = [0, 1, 2]
y = [3, 4]
z = [5, 6, 7, 8]

xyz_grid = np.meshgrid(x, y, z, indexing='ij')

xyz_list = np.reshape(xyz_grid, (3, -1), order='C').T

xyz_list

̀xyz_list可以用来调用插值函数,看起来是这样的:

array([[0, 3, 5],
       [0, 3, 6],
       [0, 3, 7],
       [0, 3, 8],
       [0, 4, 5],
       [0, 4, 6],
       [0, 4, 7],
       [0, 4, 8],
       [1, 3, 5],
       [1, 3, 6],
       [1, 3, 7],
       [1, 3, 8],
       [1, 4, 5],
       [1, 4, 6],
       [1, 4, 7],
       [1, 4, 8],
       [2, 3, 5],
       [2, 3, 6],
       [2, 3, 7],
       [2, 3, 8],
       [2, 4, 5],
       [2, 4, 6],
       [2, 4, 7],
       [2, 4, 8]])

【讨论】:

  • 感谢您的回答。我最终实现了一个在逻辑上与您的解决方案相似但在实现上没有的解决方案。我稍后会在这里发布它作为自己的答案。如果您将其与我的示例数据匹配并最终输出所需的数组,我会接受您的吗?谢谢
猜你喜欢
  • 2021-12-01
  • 2011-12-03
  • 2011-10-20
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多