使用scipy.interpolate.griddata和method=nearest时,如何在边界外使用fill_value?

5

函数scipy.interpolate.griddata允许指定关键字fill_value,文档中说明如下:

用于替换输入点的凸壳外请求点的值。如果未提供,则默认为nan。 此选项对“nearest”方法无效。

然而,在使用二维数据和method='nearest'时,我需要指定一个在边界之外使用的fill_value。如何实现呢?

1个回答

6

以下方法可以相对容易地实现:

  1. 使用method='nearest'运行
  2. 再次使用method='linear'运行;这里外部区域会被填充为np.nan
  3. 在第2步的结果中,无论哪个位置出现了NaN,请将您想要的fill_value分配给第1步的结果。

代码:

import numpy as np
from scipy.interpolate import griddata

def func(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]

points = np.random.rand(100, 2)
values = func(points[:,0], points[:,1])

grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')

fill_value = 123  # Whatever you like
grid_z0[np.isnan(grid_z1)] = fill_value

一种不那么临时的方法是明确计算凸包并将其用于分配填充值。这需要更多的努力,但可能运行更快。


谢谢您的回答,这确实是一个简单的解决方案!但在实践中,它需要比单个 method='nearest' 更长两倍的时间。我会看一下 scipy.spatial.ConvexHull,它可能会有用。 - Arcturus B
1
@Arcturus B,你是否通过使用ConvexHull找到了更好的解决方案?你可以发布并接受它。 - tiagoams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接