scipy 从一组不规则的点开始,在3D表面中插值Z值[封闭]

aelbi1ox  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(116)

已关闭。此问题需要更多的focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

六年前就关门了。
Improve this question
我有一个表面,看起来像图A,想象这是俯视图。表面已经计算了Z值。

现在我需要找到新点的所有Z值,如图B。如何做到这一点?我尝试了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。

y1aodyip

y1aodyip1#

请尝试改用griddata

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

不同之处在于griddata需要常规数据作为输入(嗯......,我认为)。这并不是说你应该得到不同的结果,而是你可以更快地发现问题。你可以很容易地屏蔽“常规网格”数据。
我的第一个猜测是,这些输入坐标并不是你所期望的(可能与你正在计算的函数的尺度不同),但如果不进行测试,很难说。
在任何情况下,您似乎都需要一个表面,根据定义,它是一种栅格数据,因此使用这种不同的框架应该很容易发现问题。
EDIT(对发帖人质疑的进一步考量):
假设你想在某个对象中输入一些数据,然后你想使用这些数据来估计任何位置,为此你可以构建一个类,如下所示:

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

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类上实现一个新的方法。这是你正在寻找的吗?

相关问题