【问题标题】:griddata scipy interpolation not working (giving nan)griddata scipy插值不起作用(给nan)
【发布时间】:2012-03-28 05:28:22
【问题描述】:

我正在尝试 scipy.interpolation.griddata 帮助文件中给出的 2d 示例。 它适用于“最近”的插值。但它在使用任何其他插值(如“线性”或“三次”)时给出了一个充满 nan 的矩阵。如果我给出参数 fill_value=5 ,它会给出填充 5 的矩阵。

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

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

我将发布示例以重现错误(采用文档格式)

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 发行版(live slackware 系列)。因此,我认为我可以安全地得出结论,这是我的安装中的一些问题。有人知道可能出了什么问题吗?是否有任何库冲突导致这种行为?由于我的主机是 Portues,除了修复其中的 scipy,我别无选择。

【问题讨论】:

  • 您能否提供您所指的帮助文档的链接?
  • @Hooked 我指的是我们在输入 griddata 时得到的帮助文档?在 IPython 中。 (代码本身内部的文档字符串)

标签: python scipy interpolation


【解决方案1】:

你说“充满了 nan”,但实际上并不是充满了。使用您的代码但添加

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 在点中都缺少一个边界框。有一些 (False, False) 情况,其中值没有边界框,但没有结束 NaN,这有点令人惊讶,但如果他们假设所有内容都包含它可能取决于无聊实施详细说明了如果不这样做会发生什么。简短版:我认为这里的一切都可能正常工作,正如预期的那样。

【讨论】:

  • 感谢您的帮助。但是我得到的矩阵完全充满了nan。当我尝试 np.isnan(grid_z1).sum() 我得到 20000 。而且 grid_z1 的大小也是 20000 。我什至尝试使用 matplotlib.pyplot.imshow 查看它。它是完全空的 nan。
  • 这很奇怪。您能否编辑您的帖子以包含完全为 NaN 的最小大小写(即小写 100、200 和 2000)?
  • 我已更改为 10x10 的较小矩阵。它仍然给我 10x10 的矩阵,里面装满了 nan。
  • 我在另一台机器上尝试了相同的脚本。它工作得很好,给出了正确的答案。我想修复我机器上的 scipy。由于它没有给出任何错误,我不知道从哪里开始。您认为造成此问题的原因可能是什么?
【解决方案2】:

尚不清楚您是如何安装 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()"

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

【讨论】:

  • 0.10.0b2 是我的 scipy 版本。现在我正在运行 scipy.test() 。它提供了大量的弃用、用户和运行时警告以及 NaN!
【解决方案3】:

我也有同样的问题,但我认为它已在 scipy 0.11rc2 中得到修复(并不是说我已经能够将它安装在我的 Enthought Python Distribution 的顶部以找出答案..)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 2011-09-17
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2020-08-19
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多