2013-10-05 61 views
3

我有一些二維數組有一些NaN值。我想使用我有數據的位置對這些值進行修復(插值)。該數組看起來像下面那個。二維數組中的NaN插值。人口稀少

如果可能,我想這樣做插值,這樣,當我從非NaN值搬走,我得到越來越接近0值

我怎麼能做到這一點?

我讀了約gridddata,但它似乎被設計用於非結構化的N-dim數據。我也閱讀other threads的答案,但我認爲他們的出發點不同。

array([[  nan,   nan,   nan,   nan,   nan, 
       nan,   nan,   nan,   nan,   nan], 
     [  nan,   nan,   nan,   nan,   nan, 
       nan,   nan,   nan,   nan,   nan], 
     [  nan,   nan,   nan,   nan,   nan, 
       nan,   nan,   nan,   nan,   nan], 
     [  nan,   nan,   nan,   nan,   nan, 
       nan,   nan,   nan,   nan,   nan], 
     [ 1.  , 0.  , 1.  , 0.  , 0.25  , 
       nan, 0.  ,   nan,   nan,   nan], 
     [  nan, 0.  ,   nan, 0.25  , 0.66666667, 
     0.25  , 0.66666667, 0.  , 1.  ,   nan], 
     [ 0.  , 0.5  , 0.66666667, 0.8  , 0.66666667, 
     0.8  , 0.5  , 0.83333333,   nan,   nan], 
     [ 0.625  , 0.5625 , 0.9  , 0.8  , 0.8  , 
     0.83333333, 0.57142857, 0.66666667, 0.5  ,   nan], 
     [  nan, 1.  , 0.71428571, 0.85714286, 1.  , 
     1.  , 1.  ,   nan,   nan,   nan], 
     [  nan,   nan,   nan,   nan, 1.  , 
     1.  ,   nan,   nan,   nan,   nan]]) 

回答

3

根據你想要使用什麼樣的插值技術,有幾十種可能的方法。事實上,由於你的數據被NaN所包圍,所以我寧願把它看作一個函數平滑然後插值。如果你想獲得更接近更遠離你是從沒有NaN的在你的2D地圖,我建議像歐幾里得距離方面爲零:

  1. 考慮各不NaN的數據點X[i,j]爲高斯居中[i,j],方差= 1,因此它的pdf([i,j]) = X[i,j],所以f_ij([a,b]) = X[i,j] * exp(-|| [a,b] - [i,j] ||^2/2)
  2. 對於每個NaN的數據點X[a,b]設置X[a,b] = sum(f_ij([a,b]))其中

當你像一個「密度估計」的結果,並通過改變方差(執行對所有[i,j]指數不NaN的數據點的Sumation公司這我建議使用= 1)你可以修改「消失速度」的值。

因此,代碼將只是一個循環遍及所有NaN,並且對於它們中的每一個,您都循環遍歷所有不是NaN並且求和gaussians值。

這將某事像這樣:

nans = np.array(np.where( np.isnan(X))).T 
notnans = np.array(np.where(~np.isnan(X))).T 
for p in nans: 
    X[p[0],p[1]] = sum(X[q[0],q[1]]*np.exp(-(sum((p-q)**2))/2) for q in notnans) 
+1

如果你選擇走這條路線,你應該知道,SciPy的具有徑向基函數的類 - 參見[這裏](HTTP://文檔。 scipy.org/doc/scipy/reference/generated/scipy.interpolate.Rbf.html)和[這裏是這個例子](http://wiki.scipy.org/Cookbook/RadialBasisFunctions) –

+0

是否有準備好的函數或標準短語普通克里格插值方法的代碼以同樣的方式處理? THanks – Spider

+0

@ali_m:在這個例子中,x,y,z需要有相同的大小。在這種情況下,x,y是1d數組,而z是2d數組! –