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
/欠落値を補間する方法はありますか?
はい、 _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')
を使用すると、次のようになります。
_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')
_
これが最終結果です。
Nan値がエッジにあり、nan値で囲まれている場合、補間できず、nan
に保たれることに注意してください。 _fill_value
_引数を使用して変更できます。
データの種類によって異なりますが、いくつかのテストを実行する必要があります。たとえば、意図的にいくつかの優れたデータをマスクして、さまざまな種類の補間を試すことができます。マスクされた値を持つ配列を使用して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
_
もちろん、これは乱数の場合なので、結果が大きく異なる可能性があるのは正常です。したがって、最善の方法は、データセットの「意図的にマスクされた」部分をテストして、何が起こるかを確認することです。
私は実際にこのマトリックスを1行ずつ手動で調べていました。ナンのリストに遭遇し始めたら、ナンの直前と直後の数と、通常の数に戻る前に見たナンの数を追跡します。これらの数値が見つかったら、Nansを補間値で自分で上書きすることができます。