网格scipy插值不起作用(给出nan)



我正在尝试scipy.interpolation.gridata帮助文件中给出的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 distro(live slackware family)上试用。因此,我认为我可以放心地得出结论,这是我安装中的一些问题。有人知道可能出了什么问题吗?任何库冲突都会导致这种行为吗?由于我的主机是Portues,我别无选择,只能修复其中的scipy。

你说"填充了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,这有点令人惊讶,但如果他们假设所有内容都包含在内,这可能取决于无聊的实现细节,如果不包含,会发生什么。简言之:我认为这里的一切都可能正常工作,正如预期的那样。

目前尚不清楚您是如何安装scipy的(或者您使用的是哪个版本-请尝试$ python -c "import scipy; print scipy.__version__"),但由于网格数据依赖于编译的代码,您看到的可能是构建问题或(不太可能)特定于您平台的网格数据错误。

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

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

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

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

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

最新更新