您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

插值缺失值2d python

插值缺失值2d python

是的,您可以使用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值包围,则无法对thay进行插值并将其保留nan。您可以使用fill_value参数进行更改。

这取决于您的数据类型,您必须执行一些测试。例如,您可以故意对一些好的数据进行蒙版,尝试使用具有蒙版值的数组尝试不同种类的插值,例如三次,线性等,并计算插值与您之前蒙版的原始值之间的差,然后查看方法返回您的细微差别。

您可以使用如下形式:

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

当然,这是针对随机数的,因此结果可能会有很大差异是正常的。因此,最好的办法是对数据集的“故意遮盖的”部分进行测试,然后看看会发生什么。

python 2022/1/1 18:47:49 有370人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶