學習自:python插值填補缺省值_插值缺失值2d python_weixin_39592315的博客-CSDN博客
問題
假設我們有一個2D數組(或者矩陣),其中有一些缺省值NaN,就像下邊這樣:
1 2 3 NaN 5 2 3 4 NaN 6 3 4 NaN NaN 7 4 5 NaN NaN 5 5 6 7 8 9
我們怎么將這些NaN填充為一些合理的值呢?
解決方案
我們可以用scipy.interpolate.griddata進行插值,這里先把完整代碼放上來:
#二維缺省值插值 import numpy as np from scipy import interpolate array = np.random.random_integers(0,10,(10,10)).astype(float) #① array[array>7] = np.nan array = np.ma.masked_invalid(array)#②
x = np.arange(0, array.shape[1])#③ y = np.arange(0, array.shape[0])
xx,yy=np.meshgrid(x,y) #④
x1 = xx[~array.mask]#⑤ y1 = yy[~array.mask] newarr = array[~array.mask].data
GD1 = interpolate.griddata((x1, y1), newarr.ravel(),(xx, yy),method='cubic')#⑥
解釋
①生成初始二維數組,在其中生成空值;
array = np.random.randint(0,10,(10,10)).astype(float) array[array>7]=np.nan #生成形狀為(10,10),值為[0,10)的隨機int值的array #將array中大於7的值設置為空 #結果array([[ 3., 0., 6., nan, nan, nan, 6., 3., 7., 6.], [ 1., 4., 4., 6., nan, 4., 1., nan, 3., 5.], [nan, 3., 0., nan, 4., 7., 7., 3., 3., 5.], [ 0., 7., 0., 2., 6., 6., 1., 4., 7., nan], [ 0., nan, nan, nan, 4., nan, 6., 0., 2., nan], [ 2., 5., 2., nan, 6., nan, 1., 2., 4., 4.], [ 4., 4., 0., 6., 5., 5., 3., 7., 7., 2.], [ 1., 6., 0., 7., 5., 4., 3., 1., 7., 0.], [ 2., 4., 4., nan, nan, 6., 3., 1., 5., 2.], [ 3., 4., 0., 3., 3., 2., 4., 4., 2., nan]])
②生成array的Masked Array;
關於Masked Array這一點可以看Python:numpy.ma模塊 - ShineLe - 博客園
array=np.ma.masked_invalid(array)
③得到array的橫縱坐標序列x,y;
x=np.arange(0,array.shape[1])
y=np.arange(0,array.shape[1])
④由橫縱坐標序列構造2維網格;
XX,YY=np.meshgrid(x,y)
⑤提取原array中有效值的橫縱坐標及值;
x1=XX[~array.mask] y1=YY[~array.mask] newarr=array[~array.mask].data #提取Masked array中的data
這里的x1、y1、newarr都是一維的,每個元素都是一一對應的,即x1[i]、y1[i]、newarr[i]對應了第i+1個有效值的橫縱坐標及值。
⑥插值,二維插值
GD1 = interpolate.griddata((x1, y1), newarr.ravel(),(xx, yy),method='cubic')
關於inerpolate.griddata,可以看Python:Scipy.interpolate.griddata - ShineLe - 博客園