为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2022-01-18 16:16:20
我有一组称为值的观察值,它来自按以下方式定义的函数: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)如果数组具有相同的形状,为什么随机声明与其他声明相比有效?任何帮助将不胜感激。非常感谢你。
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

我认为问题在于您需要确保您在维度数量以及这些维度的“域”方面保持一致。插入到未采样的地方不会得到好的结果。我认为您遇到的错误与尝试在这些地方进行计算有关。


以下是如何使 scipy.interpolate.griddata 文档中的示例适用于 7 维示例。我正在使用一个更简单的函数,它只是对points数据中的“特征”求和:


import numpy as np


def 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 griddata

grid_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 空间有很多边缘!) .


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 522 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号