插值缺失值 2d python

2024-04-25 05:44:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个二维数组(或者矩阵,如果您愿意的话)缺少一些值,表示为 NaN。丢失的值通常位于沿一个轴的条形图中,例如:

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

我调查了delaunay三角测量,但发现很少的文件。

我尝试使用^{}'s convolve,因为它支持使用2d数组,而且非常简单。 问题在于卷积不是插值,它将所有值移向平均值(可以通过使用窄核来减轻)。

这个问题应该是this post的自然二维扩展。有没有办法在二维数组中的NaN/缺失值上进行插值?


Tags: 文件矩阵数字数组nanthispost卷积
2条回答

实际上,我会一行一行地手动遍历这个矩阵,每当您开始遇到一个nan列表时,请紧跟在nan之前和之后,以及在返回到普通数字之前看到的nan的数量。一旦找到这些数字,就可以自己用插值覆盖nan。

是的,您可以使用^{}和屏蔽数组,并且可以选择您喜欢的插值类型,使用参数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')时看起来像这样 以下内容:

enter image description here

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')

这是最终结果:

enter image description here

看,如果nan值在边上,并且被nan值包围,那么它们就不能被插值并保持nan。您可以使用fill_value参数更改它。

如果有一个3x3区域的NaN值,你会得到中间点的合理数据吗?

这取决于你的数据类型,你必须进行一些测试。例如,你可以故意屏蔽一些好的数据,尝试不同类型的插值,例如立方、线性等,使用带有屏蔽值的数组,计算插值值和你之前屏蔽的原始值之间的差异,看看哪种方法返回你的小差异。

你可以用这样的东西:

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

当然这是针对随机数的,所以结果可能会有很大变化是正常的。所以最好的做法是测试数据集中的“故意屏蔽”部分,看看会发生什么。

相关问题 更多 >