首页 > 技术文章 > Python:2维(平面/数组/矩阵)缺省值插值

ShineLeBlog 2021-11-15 20:39 原文

学习自: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 - 博客园

推荐阅读