我希望能将一个一维数组中的值从不规则网格插值到规则网格上。例如,想象一下原始数据在不规则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)
然而,我并不是很喜欢这种方法...
numpy.interp()
。如果您需要索引本身,请使用numpy.searchsorted()
。唯一棘手的部分是处理超出数据范围的网格值。一旦您拥有索引,距离就很容易计算。 - Robert Kernnumpy.searchsorted
是在一维数组中查找索引的好方法,并且权重(距离)也可以很容易地计算出来。 - Iñigo Hernáez Corres