我使用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
或其他插值方法做什么?
答案 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
。