griddata scipy插值不工作(给nan)

时间:2012-03-11 15:59:41

标签: python scipy interpolation

我正在尝试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')

我将grid_z1和grid_z2作为填充了nan的矩阵。

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

3 个答案:

答案 0 :(得分:7)

你说“充满了南”,但它并没有真正充满。使用您的代码但添加

np.random.seed(7)

在开始时我们正在使用相同的数据集,我找到了

>>> np.isnan(grid_z1).sum()
744
>>> np.isnan(grid_z2).sum()
744

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

>>> np.isnan(grid_z1[5:-5,5:-5]).sum()
0

这可能是问题所在。给出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

产生

>>> d
Counter({(False, True): 19189, (True, False): 744, (False, False): 67})

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

答案 1 :(得分:1)

目前还不清楚你是如何安装scipy的(或者你正在使用哪个版本 - 尝试$ python -c "import scipy; print scipy.__version__"来查找),但由于griddata依赖于已编译的代码,因此你所看到的可能就是结果构建问题或(不太可能)特定于您的平台的griddata错误。

我建议在scipy-user邮件列表http://mail.scipy.org/mailman/listinfo/scipy-user上报告此问题,该列表比Stack Overflow更适合解决构建和安装问题。

在发布到邮件列表之前,值得安装nose测试框架http://packages.python.org/nose,以便您可以运行

$ python -c "import scipy; scipy.test()"

并同时报告任何测试失败的详细信息。

答案 2 :(得分:0)

我有同样的问题,但我认为已经修复了scipy 0.11rc2(并不是说我能够在我的Enthought Python发行版的顶部安装它来查找..)?