通过 scipy.interpolate.griddata 在 n 维网格上插值是不可能的

我有一组称为值的观察值,它来自按以下方式定义的函数:


values = np.array([oscillatory(i) for i in range(points.shape[0])])

values 的形状为 (65,1),points 是一个数组,用于评估振荡函数,它的形状为 (65,7),7 是在 7 维空间中充当维度的一些特征(7 只是一个任意数字)。


我试图插入在这个空间中定义的一些任意点。我尝试使用以下方法定义这些点:


grid_x = np.random.uniform(0,10, (100,7))

但它没有用。显然是因为网格没有正确定义所以我尝试过:


grid_x= np.mgrid[-2:2, 5:99 , 4:5, 5:6, 5:7, 6:67, 7:67]

这又不行了。我通过以下方式调用插值函数:


grid_z1 = gdd(points, values, tuple(grid_x))

但是我总是遇到一个巨大的错误,我很难理解。


奇怪的是,如果我以随机方式定义点和值,代码将起作用:


points = np.random.uniform(0,10, (65,3))

values = np.random.uniform(0,10,(points.shape[0],1))


grid_x= np.mgrid[0:2, 5:9 , 4:5]

grid_z1 = gdd(points, values, tuple(grid_x))

这里我只是尝试了 3 而不是 7,因为它更快,但原理保持不变。如果我在 7 个维度中定义它,代码也可以工作。所以我的问题是:1)我怎样才能让我的初始代码在 7 维中运行?2)如果数组具有相同的形状,为什么随机声明与其他声明相比有效?


任何帮助将不胜感激。非常感谢你。


慕哥6287543
浏览 523回答 1
1回答

精慕HU

我认为问题在于您需要确保您在维度数量以及这些维度的“域”方面保持一致。插入到未采样的地方不会得到好的结果。我认为您遇到的错误与尝试在这些地方进行计算有关。以下是如何使 scipy.interpolate.griddata 文档中的示例适用于 7 维示例。我正在使用一个更简单的函数,它只是对points数据中的“特征”求和:import numpy as npdef func(data):    return np.sum(data, axis=1)grid = np.mgrid[0:1:5j, 0:1:5j, 0:1:5j, 0:1:5j, 0:1:5j, 0:1:5j, 0:1:5j]points = np.random.rand(100, 7)values = func(points)请注意,网格覆盖了坐标的整个范围points。也就是说,由于每一列的points值都在 0 到 1 的范围内,我应该确保在这些相同的坐标上创建一个网格。from scipy.interpolate import griddatagrid_z = griddata(points, values, tuple(grid), method='linear')现在我有这个:>>> grid_z[2, 2, 2, 2, 2, :, :]array([[ nan,  nan,  nan,  nan,  nan],       [ nan, 3.  , 3.25, 3.5 ,  nan],       [ nan, 3.25, 3.5 , 3.75,  nan],       [ nan, 3.5 , 3.75, 4.  ,  nan],       [ nan,  nan,  nan,  nan,  nan]])请注意,有很多 NaN。如果你使用nearestas 方法,你总会得到一个解决方案,但当然linear插值需要两个东西来插值,所以超立方体的“边缘”是无效的(并且 7-D 空间有很多边缘!) .
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python