Python 从不规则的点集开始,在三维曲面中插值Z值

Python 从不规则的点集开始,在三维曲面中插值Z值,python,numpy,scipy,interpolation,Python,Numpy,Scipy,Interpolation,我有一个表面看起来像图a,想象一下这是顶视图。曲面已计算出Z值 现在我需要在新的点(如图B)中找到所有Z值。如何做到这一点?我尝试了scipy.interpolate.interp2d,但它给出了一些奇怪的结果,如下所示: 我只想在“图”中找到自定义x和y的自定义z 模拟代码示例 func_int = scipy.interpolate.interp2d([point[0] for point in pointsbottom],[point[1] for point in pointsbot

我有一个表面看起来像图a,想象一下这是顶视图。曲面已计算出Z值

现在我需要在新的点(如图B)中找到所有Z值。如何做到这一点?我尝试了
scipy.interpolate.interp2d
,但它给出了一些奇怪的结果,如下所示:


我只想在“图”中找到自定义x和y的自定义z

模拟代码示例

func_int = scipy.interpolate.interp2d([point[0] for point in pointsbottom],[point[1] for point in pointsbottom],[point[2] for point in pointsbottom], kind = 'linear')
pointscaption = map(lambda point:(point[0],point[1],func_int(point[0],point[1])),pointscaption)
其中,
pointsbottom
是(x,y,z)的列表,
pointscaption
是(x,y,z)的列表,但我需要找到新的z

尝试改用:

不同之处在于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()]
本例使用的是平方距离逆方法,该方法对于估计非常稳定(如果您避免被零分割)。这不会很快,但我希望这是可以理解的。从这一点开始,您可以通过执行以下操作来估计二维空间中的任意点:

    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(其中颜色表示曲面中的高度)获得可以看到的图像:

本实验的结果如下:


如果您不想使用ISD(平方反比距离),只需在Estimation类上实现一种新方法即可。这就是你要找的吗?

如果你能给我们看一本书,我们可能真的能帮助你。我猜,
z
坐标就是垂直坐标?你能澄清你的问题吗?我只是想在“图”中找到自定义x和y的自定义z。它工作得更好一点,但仍然不够。这里是一个屏幕截图:看起来你只是在改变一些位置,而其他位置没有被选中。是否确定代码中的栅格对象与正在查看的曲面具有完全相同的形状?你能在2D高度图(z是一个颜色变量)中绘制它吗?这会更容易理解几何图形。对不起,我不知道怎么做。我可以用非常简单的词来描述-我有一些光滑的表面,不规则的x和y,还有一些z,我想为我在表面上添加的新点找到z。好的。我用一些你应该能够适应自己的代码(包括2D可视化和估算)的方法编辑了我的文章。看看它是否适合您的问题。您好,我收到错误-文件“/home/username/anaconda3/lib/python3.7/site packages/numpy/ma/core.py”,第1018行,在call result=self.f(da,db,*args,**kwargs)类型错误:不支持的操作数类型*:“float”和“SingleBlockManager”
    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)
    import matplotlib.pyplot as plt
    plt.imshow(surf.T,origin='lower',interpolation='nearest')
    plt.scatter(datax,datay,c=dataz,s=90)
    plt.show()