在Python中使用NaN值进行2D插值

时间:2018-07-23 08:45:09

标签: python scipy

我有一个二维矩阵(1800 * 600),具有许多NaN值。
enter image description here
我想进行二维插值,这在matlab中非常简单。 但是,如果使用scipy.interpolate.inter2d,则结果为NaN矩阵。我知道可以使用NaN来填充scipy.interpolate.griddata的值,但是我不想满足Nan的要求。我还可以使用什么其他功能进行2d插值?

1 个答案:

答案 0 :(得分:2)

使用inter2d的一种解决方法是执行两次插值:一次在填充的数据上(将NaN替换为任意值),另一次用于跟踪未定义的区域。然后可以将NaN值重新分配给以下区域:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from scipy.interpolate import interp2d

# Generate some test data:
x = np.linspace(-2, 2, 40)
y = np.linspace(-2, 2, 41)
xx, yy = np.meshgrid(x, y)

z = xx**2+yy**2
z[ xx**2+yy**2<1 ] = np.nan

# Interpolation functions:
nan_map = np.zeros_like( z )
nan_map[ np.isnan(z) ] = 1

filled_z = z.copy()
filled_z[ np.isnan(z) ] = 0

f = interp2d(x, y, filled_z, kind='linear')
f_nan = interp2d(x, y, nan_map, kind='linear')     

# Interpolation on new points:
xnew = np.linspace(-2, 2, 20)
ynew = np.linspace(-2, 2, 21)

z_new = f(xnew, ynew)
nan_new = f_nan( xnew, ynew )
z_new[ nan_new>0.5 ] = np.nan

plt.pcolor(xnew, ynew, z_new);