Python 插入缺少的值

Python 插入缺少的值,python,numpy,interpolation,Python,Numpy,Interpolation,我有一个2d数组(或者矩阵,如果你喜欢的话),其中一些缺失的值表示为 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三角测量,但发现的文档很少 我尝试使用,因为它支持使用2d数组,而且非常简单。 问题是卷积不是插值,它将所有值移向平均值(这可以通过使用窄核来

我有一个2d数组(或者矩阵,如果你喜欢的话),其中一些缺失的值表示为
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三角测量,但发现的文档很少

我尝试使用,因为它支持使用2d数组,而且非常简单。 问题是卷积不是插值,它将所有值移向平均值(这可以通过使用窄核来缓解)


这个问题应该是问题的自然二维延伸。是否有方法在2d数组中插入缺失的值

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

是的,您可以使用和屏蔽数组,并且您可以选择您喜欢的插值类型,使用参数
方法
通常
'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')
:

这是最终结果:

看,如果nan值在边上,并且被nan值包围,那么它们就不能被插值,并且会被保留
nan
。您可以使用
fill\u 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
这就产生了这样的结果:

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

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

有很多方法可以对其进行插值。一个困难是数据不再是矩形的,许多简单的2d插值算法都需要这样做,但这仍然是可能的。您对插值有什么特殊要求吗?例如,这可能正是您所需要的。只需传入非NaN的数据点,然后在构建插值后在NaN点重新采样。此外,这个问题:看起来基本相同。@JeremyWest非常感谢您提供的链接,我认为这与我所寻找的非常接近。如果存在3x3 NaN值区域,这将如何工作,你能得到关于中间点的合理数据吗?@M.T嗨,我已经编辑了答案,来回答这个问题。