从查找中插入数据 table

Interpolating data from a look up table

阅读查找 table

LUT = np.genfromtxt('test.out', delimiter=',', dtype=float)
LUT:
    12, 25, 136, 6743
    13, 26, 139, 6786
    14, 27, 142, 6791
    15, 28, 145, 6789

从LUT中读取的值如下:

x1, x2, x3 = 12.5, 25.5, 137

为每个给定值(3 列)读取 LUT 中相邻的两个值,我必须对结果进行线性插值(LUT 中的第 4 列)。

给定值 (x1, x2, x3) 属于 LUT 的第 1 行和第 2 行之间。基于此如何读取第一行和第二行之间的结果?

有点不清楚 - 您正在使用的上下文。

假设这是一个更通用的 LUT: 通过第 4 列的 euclidian distance to all points in the the LUT from the provided point. After establishing those 2 points, use bilinear interpolation 找到最近的 2 个点。

现在,如果每列在锁定步骤 w/(1, 1, 3) 中增加,并且您在这里有一些顺序概念,请仅使用第一维和第四维找到 upper and lower bounds with python's bisect module of the first column and you're done finding the indices you would interpolate with (bilinearlly?). Since you mention in the comments below the delta is fixed, this makes this far more a 1d LUT problem than a 3d problem - arguably you could use numpy.interp

如果它们不处于锁定步骤但保留了类似的顺序,则通过生成跨列的累积 upper/lower 界限来限制允许的上限和下限索引的范围,然后决定您想要的索引在该范围内进行插值。

对于所有这些,如果您在 LUT 中找到了精确值,请不要费心插值。

给定要插值的坐标列表 coords,您可以使用 scipy.spatial.cKDTree 获取线性插值所需的 table 中最接近的 2 个条目。下面的代码显示了一个用法示例,已经矢量化。

import numpy as np
from scipy.spatial import cKDTree

# inputs
LTU = np.genfromtxt('test.txt', delimiter=',')

coords = ((12.5, 25.5, 137),
          (13.5, 26.5, 141),
          (14.5, 25.5, 144))

# querying and interpolating
xyz = LTU[:, :3]
val = LTU[:, 3]

del LTU # attempt to clean up memory

tree = cKDTree(xyz)
dist, ind = tree.query(coords, k=2)

d1, d2 = dist.T
v1, v2 = val[ind].T
v = (d1)/(d1 + d2)*(v2 - v1) + v1

print(v)
#[ 6758.73909236  6789.16987298  6790.03575996]