从scipy Regular Grid Interpolator返回二维数组

时间:2017-01-31 13:17:45

标签: python arrays numpy scipy interpolation

我使用Scipy以6维方式插入数据,并想要一种从内插器对象而不是一维数组返回二维数组的方法。目前,我只能通过使用for循环并多次调用插补器对象来实现这一点 - 我希望那里有更好的方法。

例如,在3D中:

#Random data
points=(np.arange(10), np.arange(5), np.arange(5))
values=np.random.rand(10, 5, 5)

interp_object=scipy.interpolate.RegularGridInterpolator(points, values)

我希望能够做到:

#Pick some points along each axis
x_points=np.arange(10)
y_points=[1.2, 3.1, 1.4, 4.8, 0.1]
z_points=3.5


xi=(x_points, y_points, z_points)

out_array=interp_object(xi)

但这会导致

ValueError: shape mismatch: objects cannot be broadcast to a single shape

我必须最终做:

out_array=np.empty((10, 5))
for i, y in enumerate(y_points):
    out_array[:, i]=interp_object((x_points, y, z_points))

这个循环是我的代码中的主要瓶颈,我想尽可能避免它!我希望使用RegularGridInterpolator或其他插值方法做什么?

1 个答案:

答案 0 :(得分:0)

这部分代码:

#Pick some points along each axis
x_points=np.arange(10)
y_points=[1.2, 3.1, 1.4, 4.8, 0.1]
z_points=3.5

xi=(x_points, y_points, z_points)

out_array=interp_object(xi)

不起作用,因为您必须将输入作为所需要的所有点的数组。所以我们需要生成一个包含所有组合的矩阵。为此,我们可以使用meshgrid。我们还需要在数组维度中包含一些操作以使一切正常工作,因此它可能看起来有点混乱。以下是一个例子:

#Pick some points along each axis
x_points = np.arange(9) + 0.5  # Points must be inside
y_points = np.array([1.2, 3.1, 1.4, 3.9, 0.1])
z_points = np.array([3.49])

points = np.meshgrid(x_points, y_points, z_points)
flat = np.array([m.flatten() for m in points])
out_array = interp_object(flat.T)
result = out_array.reshape(*points[0].shape)

另请注意,我已经改变了你给出的一点。 RegularGridInterpolator只能用于插值,如果在创建插值函数时给出的范围之外使用,则无效,在这种情况下称为interp_object