我正在创建一个Scipy Interpolate RectBivariateSpline,如下所示:
import numpy as np
from scipy.interpolate import RectBivariateSpline
x = np.array([1,2,3,4])
y = np.array([1,2,3,4,5])
vals = np.array([
[4,1,4,4,2],
[4,2,3,2,6],
[3,7,4,3,5],
[2,4,5,3,4]
])
rect_B_spline = RectBivariateSpline(x, y, vals)
然后我尝试传入一个x和y点的数组:
a = np.array([3.2, 3.8, 2.2])
b = np.array([2.4, 4.3, 3.3])
print(rect_B_spline(a, b))
我得到的错误如下:
Traceback (most recent call last):
File "path/file", line 18, in <module>
print(rect_B_spline(a, b))
File "/path/scipy/interpolate/fitpack2.py", line 728, in __call__
raise ValueError("Error code returned by bispev: %s" % ier)
ValueError: Error code returned by bispev: 10
当我将grid = False参数传递给方法时,可以解决此错误。
我对documentation的印象是,如果输入网格坐标形成规则网格,则网格参数应为True。有什么我想念的吗?
答案 0 :(得分:3)
是的,这里的文档可能有点弱。您正在使用的默认调用期望x和y定义网格点。就像创建样条拟合的原始调用一样,这些需要严格按升序排列。然后它将返回完整的样条插值网格。
如果您改为使用RectBivariateSpline.ev(xi,yi),在您的情况下调用rect_B_spline.ev(a,b),您将获得在(xi [0],yi [0]),...的每个处计算的样条曲线。 ..,(xi [j],yi [j])数据对。
不太确定你想要的是什么 - 如果你想要一个完整的x x y网格,那么要使每个x,y中的点严格上升。如果想要在一系列点上得到结果,请使用.ev(x,y)方法。
答案 1 :(得分:0)
这有效:
RectBivariateSpline(x,y,vals)([2.2,3.2,3.8],[2.4,3.3,4.3],grid=True)
array([[ 3.197056, 2.75356 , 2.38796 ],
[ 6.408896, 3.56696 , 3.46736 ],
[ 5.768704, 4.33264 , 3.10824 ]])
RectBivariateSpline(x[:,None],y,vals)(a,b,grid=False)
# array([ 6.408896, 3.10824 , 2.75356 ])
我按照文档中的规定对值进行了排序:
如果grid为True:在坐标数组x,y定义的网格点处计算样条曲线。数组必须按递增顺序排序。