Python:2维(平面/数组/矩阵)缺省值插值
学习自: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这一点可以看
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 - 博客园