scipy.interp2d警告和网格上的大错误

时间:2016-01-04 02:03:22

标签: python numpy scipy interpolation

我正在尝试插入一个二维函数,我遇到了scipy.interpolate.interp2d我认为奇怪的行为。我不明白问题所在,我会很乐意提供任何帮助或提示。

import numpy as np
from scipy.interpolate import interp2d

x = np.arange(10)
y = np.arange(20)
xx, yy = np.meshgrid(x, y, indexing = 'ij')
val = xx + yy
f = interp2d(xx, yy, val, kind = 'linear')

当我运行此代码时,我收到以下警告:

  

scipy / interpolate / fitpack.py:981:RuntimeWarning:不再有结了   因为B样条系数的数量已经超过了   数据点数m。可能的原因:s或m太小。   (fp> s)kx,ky = 1,1 nx,ny = 18,15 m = 200 fp = 0.000000 s = 0.000000
  warnings.warn(RuntimeWarning(_iermess2 [ierm] [0] + _mess))

当我告诉它它应该进行线性插值时,我不明白为什么interp2d会使用任何样条曲线。当我继续并在网格上评估f时,一切都很好:

>>> f(1,1)
array([ 2.])

当我从网格中评估它时,即使函数显然是线性的,我也会遇到很大的错误。

>>> f(1.1,1)
array([ 2.44361975])

我有点困惑,我不确定问题是什么。有没有人遇到过类似的问题?我曾经和matlab一起工作,这几乎是1:1我会怎么做,但也许我做错了。

当我使用矩形网格(即y = np.arange(10))时,一切顺利,但这不是我需要的。当我使用立方而不是线性插值时,误差会变小(因为函数是线性的,所以没有多大意义),但仍然是不可接受的大。

1 个答案:

答案 0 :(得分:2)

我尝试了几件事,并设法使用scipy.LinearNDInterpolator得到(有点)我想要的东西。但是,我必须将网格转换为点和值列表。由于我的程序的其余部分以网格格式存储坐标和值,这是令人讨厌的,所以如果可能的话,我仍然希望让原始代码正常工作。

import numpy as np
import itertools
from scipy.interpolate import LinearNDInterpolator

x = np.arange(10)
y = np.arange(20)
coords = list(itertools.product(x,y))
val = [sum(c) for c in coords]
f = LinearNDInterpolator(coords, val)

>>>f(1,1)
array(2.0)

>>> f(1.1,1)
array(2.1)