griddata scipy插值不工作(给nan)

ind*_*joe 4 python interpolation scipy

我正在尝试scipy.interpolation.griddata帮助文件中给出的第2个示例.它适用于"最近"的插值.但它使用填充了纳米的矩阵,同时使用任何其他插值,如"线性"或"立方体".如果我给出参数fill_value = 5,它给出填充5的矩阵.

这是由于某些安装问题吗?

我正在尝试他们在帮助文档中给出的完全相同的东西.但不知何故,它给出了结果,好像我要求插值的点位于输入点之外.(这不是!!我按照例子)

我将发布示例来重现错误(采取doc格式)

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:10j, 0:1:10j]
points = np.random.rand(100, 2)
values = func(points[:,0], points[:,1])

from scipy.interpolate import griddata

grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')
Run Code Online (Sandbox Code Playgroud)

我得到grid_z1和grid_z2是一个填充nan的矩阵.

更新:我在另一台Ubuntu 11.10机器上安装了所有软件包.并且相同的脚本给出了完全正确的答案.以前我在尝试使用Porteus发行版(实时slackware系列).因此,我认为我可以安全地得出结论,这是我的安装中的一些问题.任何人都知道什么可能出错?任何图书馆冲突都会导致这种行为吗?由于我的主机是Portues,我没有其他选择,只能修复其中的scipy.

DSM*_*DSM 7

你说"充满了南",但它并没有真正充满.使用你的代码,但添加

np.random.seed(7)
Run Code Online (Sandbox Code Playgroud)

我发现,一开始我们正在使用相同的数据集

>>> np.isnan(grid_z1).sum()
744
>>> np.isnan(grid_z2).sum()
744
Run Code Online (Sandbox Code Playgroud)

这些NaN发生在外面的一个乐队:

>>> np.isnan(grid_z1[5:-5,5:-5]).sum()
0
Run Code Online (Sandbox Code Playgroud)

这可能是问题所在.给出NaN的点在指定点之外,因此它不知道如何处理它们.对于"最近"插值的特殊情况,您仍然可以找到附近的内容,因此您不会得到任何NaN.

因此,当你说要插入的点不在输入点之外时,我不同意:

# brute force, because I'm too lazy
from collections import Counter
d = Counter()
for x, y, val in zip(grid_x.flat, grid_y.flat, grid_z1.flat):
    pg = (points >= [x, y])
    boxed = len(set(tuple(p) for p in pg)) == 4
    d[np.isnan(val), boxed] += 1
Run Code Online (Sandbox Code Playgroud)

产生

>>> d
Counter({(False, True): 19189, (True, False): 744, (False, False): 67})
Run Code Online (Sandbox Code Playgroud)

并且没有(真实的,真实的)案例.IOW,每个NaN都缺少一个边界框.有一些(假,假)情况,其中值没有边界框,但没有结束NaN,这是有点令人惊讶的,但如果他们假设一切都被包含,它可能取决于无聊实现细节如果不是,会发生什么.简短版本:我认为这里的所有内容都可能正常工作,正如预期的那样.