从不规则点集开始对3D曲面中的Z值进行插值[关闭]

从不规则点集开始对3D曲面中的Z值进行插值[关闭],第1张

从不规则点集开始对3D曲面中的Z值进行插值[关闭]

尝试改用griddata:

    grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')

区别在于griddata希望将常规数据作为输入(嗯,我认为)。并不是说您应该有不同的结果,而是更多,您将能够更快地发现问题。您可以轻松屏蔽“常规网格”数据。

我的第一个猜测是这些输入坐标不是您期望的(可能与您正在计算的函数的比例不同),但是如果不进行测试就很难说。

在任何情况下,似乎都需要一个表面,根据定义,该表面是网格数据的一种,因此使用此不同的框架很容易发现问题。

编辑(关于海报问题的进一步考虑):

假设您想要一些对象,您想要在其中输入一些数据。完成此 *** 作后,您希望能够使用该数据估算任何位置。为此,您可以构建这样的类:

    import numpy as np    class Estimation():        def __init__(self,datax,datay,dataz): self.x = datax self.y = datay self.v = dataz        def estimate(self,x,y,using='ISD'): """ Estimate point at coordinate x,y based on the input data for this class. """ if using == 'ISD':     return self._isd(x,y)        def _isd(self,x,y): d = np.sqrt((x-self.x)**2+(y-self.y)**2) if d.min() > 0:     v = np.sum(self.v*(1/d**2)/np.sum(1/d**2))     return v else:     return self.v[d.argmin()]

本示例使用反平方距离方法,该方法对于估计非常稳定(如果避免除以零)。它不会很快,但我希望它是可以理解的。从这一点开始,您可以通过执行以下 *** 作来估算2D空间中的任意点:

    e = Estimation(datax,datay,dataz)    newZ = e.estimate(30,55) # the 30 and 55 are just example coordinates

如果要对整个网格执行此 *** 作:

    datax,datay = np.random.randint(0,100,10),np.random.randint(0,100,10)    dataz       = datax/datay    e = Estimation(datax,datay,dataz)    surf = np.zeros((100,100))    for i in range(100):        for j in range(100): surf[i,j] = e.estimate(i,j)

您将使用例如matplotlib(其中颜色代表表面的高度)获得可以看到的图像:

    import matplotlib.pyplot as plt    plt.imshow(surf.T,origin='lower',interpolation='nearest')    plt.scatter(datax,datay,c=dataz,s=90)    plt.show()

该实验的结果是:

如果您不想使用ISD(平方反比),只需在Estimation类上实现一个新方法。这是你想要的?



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存