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

2024-09-24 08:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

现在我需要在新的点中找到所有的Z值,如图B所示?我试过scipy.interpolate.interp2d,但结果却很奇怪: enter image description here

我只想在“图形”中找到自定义的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


Tags: in图形列表forscipy表面intpoint
1条回答
网友
1楼 · 发布于 2024-09-24 08:37:44

请尝试改用griddata

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

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

我的第一个猜测是,这些输入坐标不是您期望的那样(也许与您正在计算的函数具有不同的比例),但是如果不进行测试,很难说出来。在

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

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

假设你想要一个对象,你想在里面输入一些数据。在完成这项工作之后,你希望能够使用这些数据来估计任何位置。为此,您可以构建这样的类:

^{pr2}$

这个例子使用的是平方反比法,它对于估计非常稳定(如果你避免被零除)。不会很快,但我希望可以理解。从这一点开始,您可以通过执行以下操作来估计二维空间中的任何点:

    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()

实验结果如下:

Estimated Surface

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

相关问题 更多 >