1D非规则网格转换为1D常规网格

3

我希望能将一个一维数组中的值从不规则网格插值到规则网格上。例如,想象一下原始数据在不规则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)

我想找到每个目标数组 dest_x 中每个点与原始坐标数组 source_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)

然而,我并不是很喜欢这种方法...

2
对于线性插值,只需使用 numpy.interp()。如果您需要索引本身,请使用 numpy.searchsorted()。唯一棘手的部分是处理超出数据范围的网格值。一旦您拥有索引,距离就很容易计算。 - Robert Kern
感谢您的回答,numpy.searchsorted是在一维数组中查找索引的好方法,并且权重(距离)也可以很容易地计算出来。 - Iñigo Hernáez Corres
@RobertKern,您的评论就是答案!您可以将其发布为官方答案,以便人们更快地找到它... - Saullo G. P. Castro
1个回答

2

对于线性插值,只需使用numpy.interp()。如果您需要索引本身,请使用numpy.searchsorted()。唯一棘手的问题是处理在数据范围之外的网格值。一旦您获得了索引,计算距离就很容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接