python中基于自然邻域的散乱数据空间插值

2024-04-26 20:53:31 发布

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

我正试着对一个巨大的物体进行温度插值,这个物体是由一个叫做PbWO4的闪烁体构成的。有10个叫做“卫星”的外部温度传感器,可以帮助我只参考4个点的内部温度。我面临的主要问题是,scipy的griddata方法和https://pypi.org/project/naturalneighbor/的griddata方法计算了身体所有顶点的温度,加起来可以达到200万(200mm*100mm*100mm)。这个任务要做很多次,我问自己,如果这里有人有类似的问题,只在这4点插值,而不是200万。你可以在下面看到我的尝试

class Interpolate:
    def __init__(self, xpos, ypos, zpos, data):

        self.x = np.asarray(xpos)
        self.y = np.asarray(ypos)
        self.z = np.asarray(zpos)
        self.v = np.asarray(data)
        self.points = np.array([self.x, self.y, self.z]).T

        self.dx = int(max(self.x) - min(self.x) + 1)
        self.dy = int(max(self.y) - min(self.y) + 1)
        self.dz = int(max(self.z) - min(self.z) + 1)

        self.xg = np.linspace(min(self.x), max(self.x), self.dx)
        self.yg = np.linspace(min(self.y), max(self.y), self.dy)
        self.zg = np.linspace(min(self.z), max(self.z), self.dz)

        self.grid_linear = tuple(np.meshgrid(self.xg, self.yg, self.zg))
        self.grid_natnei = [
            [min(self.x), max(self.x) + 1, 1],
            [min(self.y), max(self.y) + 1, 1],
            [min(self.z), max(self.z) + 1, 1],
        ]


    def return_value_at_point(self, point, data):
        X, Y, Z = self.grid_linear
        for i, j, k, l in zip(X, Y, Z, data):
            for ii, jj, kk, ll in zip(i, j, k, l):
                for iii, jjj, kkk, lll in zip(ii, jj, kk, ll):
                    if [iii, jjj, kkk] == point:
                        return lll
    def do_interpolate_linear(self):
        return griddata(self.points, self.v, self.grid_linear, method="linear")

    def do_interpolate_natural(self):
        return naturalneighbor.griddata(self.points, self.v, self.grid_natnei)

代码执行方式如下: 为了研究测试用例,我使用了一个边长为20mm的立方体,其中心位于

x = [-10, -10, -10, -10, 10, 10, 10, 10]
y = [-10, -10, 10, 10, -10, -10, 10, 10]
z = [-10, 10, -10, 10, -10, 10, -10, 10]
v = [0, 0, 0, 0, 0, 0, 0, 100]
I = Interpolate(y, x, z, v)
interp_n = I.do_interpolate_natural()

Tags: selfdatareturndefnpmin温度max