2016-11-06 171 views
0

2D插值我需要在2D陣列numpy的執行一些Nan值的內插,例如參見下面的圖片:不同的結果與scipy.interpolate.griddata

enter image description here

以我當前的方法對於插值過程,我使用了scipy.interpolate.griddata 。但是我注意到當 鏡像兩個軸上的陣列,即d2 = d[::-1, ::-1], 時,插值給出了不同的結果。 下面是一個完整的例子:

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.interpolate as interp 

def replace_outliers(f): 
    mask = np.isnan(f) 
    lx, ly = f.shape 
    x, y = np.mgrid[0:lx, 0:ly] 
    z = interp.griddata(np.array([x[~mask].ravel(),y[~mask].ravel()]).T, 
              f[~mask].ravel(), 
              (x,y), method='linear', fill_value=0) 
    return z 

def main(): 
    d = np.load('test.npy') 
    d2 = d[::-1, ::-1] 

    dn = replace_outliers(d) 
    dn2 = replace_outliers(d2) 

    print np.sum(dn - dn2[::-1, ::-1]) 

    plt.imshow(dn-dn2[::-1, ::-1], interpolation='nearest') 
    plt.colorbar() 
    plt.show() 


if __name__=='__main__': 
    main() 

這給了兩個插補之間的區別:

enter image description here

np.sum作爲評價其約-62.7

那麼怎麼會這樣數組 的簡單鏡像在插值過程中給出了不同的結果? 我使用的座標有可能是錯的嗎?

回答

1

原因可能是線性插值爲三角形爲基礎的。然而,這樣的正方形網格是Delaunay三角剖分的退化情況,並且三角剖分不是唯一的。我可以想象,結果取決於數據點的順序。

對於丟失的數據點,我猜這兩種情況對應的空空間的不同三角:

      A     A 
* * *    *---*---*   *---*---* 
         |/ \ |   |/| \ | 
*  *  => D*-------*B or D* | *B 
         | \ /|   | \ |/| 
* * *    *---*---*   *---*---* 
          C     C 

如果你現在計算爲中心的價值,你會得到(B + d)/ 2個來自一個三角測量,(A + C)/ 2來自另一個三角測量。

+0

謝謝您的回覆,這可能確實如此......但是這兩種情況之間的總體差異應該小於上述情況嗎?它與現場的順序相同。 – jrsm

+0

順便說一下,如果有更好的方法來執行這種插值,請讓我知道:) – jrsm

+0

如果數據如上所述,我猜這個字段的順序是垂直插入與水平插入之間可能的差異。 –