gpt4 book ai didi

python - 从 scipy 常规网格插值器返回二维数组

转载 作者:太空宇宙 更新时间:2023-11-03 15:43:34 25 4
gpt4 key购买 nike

我正在使用 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 或其他插值方法可以实现我想要做的事情吗?

最佳答案

这部分代码:

#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

关于python - 从 scipy 常规网格插值器返回二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41958625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com