首页 文章

griddata scipy插值不工作(给nan)

提问于
浏览
3

我正在尝试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的矩阵 .

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

3 回答

  • 0

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

    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})
    

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

  • 1

    它's not clear how you installed scipy (or which version you'正在使用 - 尝试 $ 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()"
    

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

  • 7

    我有同样的问题,但我认为它已修复scipy 0.11rc2(不是我能够安装在我的Enthought Python发布的顶部找出...)?

相关问题