2013-05-20 48 views
2

我想插值從一個不規則網格到一個常規網格的一維數組中。例如,假設原始數據具有在不規則地間隔開的X值的座標:1D不規則網格到1d規則網格

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座標數組。例如:

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()'。唯一棘手的問題是處理數據範圍之外的網格值。一旦你有了指數,距離很容易計算。 –

+0

感謝您的回答,'numpy.searchsorted'是找到一維數組中索引的好方法,而且權重(距離)也很容易計算出來。 –

+0

@RobertKern您的評論就是答案!您可以將其作爲正式答案發布,以便人們可以更快地找到它。 –

回答

2

直線插補,只需使用numpy.interp()。如果您需要自己的指數,請使用numpy.searchsorted()。唯一棘手的問題是處理數據範圍之外的網格值。一旦你有了指數,距離很容易計算。