web-dev-qa-db-ja.com

欠落している値を補間する2d python

NaNとして表されるいくつかの欠落値を持つ2D配列(または必要に応じて行列)があります。欠落している値は通常、1つの軸に沿ったストリップにあります。例:

1   2   3 NaN   5
2   3   4 Nan   6
3   4 Nan Nan   7
4   5 Nan Nan   8
5   6   7   8   9

ここで、NaNをやや意味のある数字に置き換えたいと思います。

ドロネー三角形分割を調べましたが、ドキュメントはほとんど見つかりませんでした。

astropy's convolve を使用してみました。これは、2次元配列の使用をサポートしており、非常に簡単です。これに伴う問題は、畳み込みが補間ではなく、すべての値を平均に向かって移動することです(これは狭いカーネルを使用することで軽減できます)。

この質問は、 この投稿 への自然な2次元拡張である必要があります。 2D配列のNaN /欠落値を補間する方法はありますか?

12
M.T

はい、 _scipy.interpolate.griddata_ とマスクされた配列を使用でき、引数methodを使用して好みの補間のタイプを選択できます。通常は_'cubic'_は優れた仕事をします。

_import numpy as np
from scipy import interpolate


#Let's create some random  data
array = np.random.random_integers(0,10,(10,10)).astype(float)
#values grater then 7 goes to np.nan
array[array>7] = np.nan
_

plt.imshow(array,interpolation='nearest')を使用すると、次のようになります。

enter image description here

_x = np.arange(0, array.shape[1])
y = np.arange(0, array.shape[0])
#mask invalid values
array = np.ma.masked_invalid(array)
xx, yy = np.meshgrid(x, y)
#get only the valid values
x1 = xx[~array.mask]
y1 = yy[~array.mask]
newarr = array[~array.mask]

Gd1 = interpolate.griddata((x1, y1), newarr.ravel(),
                          (xx, yy),
                             method='cubic')
_

これが最終結果です。

enter image description here

Nan値がエッジにあり、nan値で囲まれている場合、補間できず、nanに保たれることに注意してください。 _fill_value_引数を使用して変更できます。

NaN値の3x3領域がある場合、これはどのように機能しますか?中間点の適切なデータを取得しますか?

データの種類によって異なりますが、いくつかのテストを実行する必要があります。たとえば、意図的にいくつかの優れたデータをマスクして、さまざまな種類の補間を試すことができます。マスクされた値を持つ配列を使用して3次、線形などを計算し、補間された値と以前にマスクされた元の値との差を計算し、どちらのメソッドがわずかな差を返すかを確認します。

次のようなものを使用できます。

_reference = array[3:6,3:6].copy()
array[3:6,3:6] = np.nan
method = ['linear', 'nearest', 'cubic']

for i in method:
    Gd1 = interpolate.griddata((x1, y1), newarr.ravel(),
                              (xx, yy),
                                 method=i)
    meandifference = np.mean(np.abs(reference - Gd1[3:6,3:6]))
    print ' %s interpolation difference: %s' %(i,meandifference )
_

それはこのようなものを与えます:

_   linear interpolation difference: 4.88888888889
   nearest interpolation difference: 4.11111111111
   cubic interpolation difference: 5.99400137377
_

もちろん、これは乱数の場合なので、結果が大きく異なる可能性があるのは正常です。したがって、最善の方法は、データセットの「意図的にマスクされた」部分をテストして、何が起こるかを確認することです。

12
G M

私は実際にこのマトリックスを1行ずつ手動で調べていました。ナンのリストに遭遇し始めたら、ナンの直前と直後の数と、通常の数に戻る前に見たナンの数を追跡します。これらの数値が見つかったら、Nansを補間値で自分で上書きすることができます。

0
Everyone_Else