我想在一维数组中将值从不规则网格插入到常规网格中。例如,假设原始数据具有不规则间隔X坐标的值:
source_x = np.asarray([127.3, 759.4, 1239.1, ..., 98430.1])
source_y = whatever(x) # No really a function but a set of masurements
目标网格也是1D,但X坐标沿轴有规律地间隔:
dest_x = np.arange(250, 100000, 500)
我想找到目标source_x
坐标数组的每个点的原始dest_x
坐标数组中两个最接近元素的距离和索引。例如:
dest_x[0] = 250
indices = [0, 1]
distances = [250-127.3, 759.4-250]
如果可能,这应该作为原子操作完成。
我的第一个想法是使用scipy.spatial.KDTree
,但这不允许1D数据。还有其他选择吗?
修改
有一个“丑陋”选项涉及零的“虚拟”坐标,允许使用scipy.spatial.KDTree
:
source_x = np.asarray([127.3, 759.4, 1239.1, ..., 98430.1])
source_dummy = np.zeros_like(source_x)
dest_x = np.arange(250, 100000, 500)
dest_dummy = np.zeros_like(dest_x)
src = np.vstack((source_x, source_dummy)).T
dst = np.vstack((dest_x, dest_dummy)).T
tree = KDTree(src)
distances, indices = tree.query(dst, 2)
但是,我不太喜欢这种方法......
答案 0 :(得分:2)
对于线性插值,只需使用numpy.interp()
。如果您需要索引本身,请使用numpy.searchsorted()
。唯一棘手的问题是处理数据范围之外的网格值。获得指数后,距离很容易计算。