带有屏蔽数据的 Scipy 插值?

hur*_*ght 5 python arrays numpy scipy

我正在尝试插入一个包含屏蔽数据的二维数组。我使用了一些 SciPy 模块的可用方法,包括interp2d, bisplrep/bisplev,以及RectBivariateSpline。作为附加信息,我的数据是一个常规数组,这意味着网格具有相同的维度(在本例中为 1ºX1º)。

话虽如此,有没有办法用 Python 在数组中插入避免屏蔽数据?我还是新手,使用 Python 和 NumPy/SciPy 模块。

MSe*_*ert 4

实际上,您可以使用每个接受掩码数据的函数( interp2dx, y, z就是这种情况,也可能是其他函数)。但您需要显式创建一个:mgrid

z = ... # Your data
x, y = np.mgrid[0:z.shape[0], 0:z.shape[1]]
Run Code Online (Sandbox Code Playgroud)

然后您需要删除所有这些坐标中的所有屏蔽值:

x = x[~z.mask]
y = y[~z.mask]
z = z[~z.mask]
Run Code Online (Sandbox Code Playgroud)

通过这些最终,x, y, z您可以调用每个指定的函数(接受不完整的网格,因此RectBivariateSpline不起作用)。但请注意,其中一些使用插值框,因此如果由于掩码而丢弃数据的区域太大,则插值将在那里失败(导致np.nan或 0)。但如果发生这种情况,您可以调整参数来弥补这一点。

例如:

data = np.random.randint(0, 10, (5,5))
mask = np.random.uniform(0,1,(5,5)) > 0.5
z = np.ma.array(data, mask=mask)
x, y = np.mgrid[0:z.shape[0], 0:z.shape[1]]
x1 = x[~z.mask]
y1 = y[~z.mask]
z1 = z[~z.mask]
interp2d(x1, y1, z1)(np.arange(z.shape[0]), np.arange(z.shape[1]))

array([[  1.1356716 ,   2.45313727,   3.77060294,   6.09790177, 9.31328935],
       [  3.91917937,   4.        ,   4.08082063,   3.98508121, 3.73406764],
       [ 42.1933738 ,  25.0966869 ,   8.        ,   0.        , 0.        ],
       [  1.55118338,   3.        ,   4.44881662,   4.73544593, 4.        ],
       [  5.        ,   8.        ,  11.        ,   9.34152525, 3.58619652]])
Run Code Online (Sandbox Code Playgroud)

你可以看到一小部分 0,因为掩码有很多掩码值:

mask
array([[False,  True,  True,  True, False],
       [False, False,  True, False, False],
       [ True,  True, False,  True,  True],
       [False,  True, False,  True,  True],
       [False,  True, False, False,  True]], dtype=bool)

data
array([[2, 4, 4, 5, 5],
       [1, 4, 1, 3, 8],
       [9, 1, 8, 0, 9],
       [7, 2, 0, 3, 4],
       [9, 6, 0, 4, 4]])
Run Code Online (Sandbox Code Playgroud)

  • 你的方法很有趣。我尝试使用我的实际数据运行一个函数[如您的示例]。然而,正如您所提到的,大的遮罩区域被转换为 0。就我而言,“0”很重要,因为我正在处理温度和降水的气候数据。因此,我无法在插值后删除或屏蔽那些 0。非常感谢! (2认同)