Python 沿曲线计算scipy 2D插值的输出
我在网格点Python 沿曲线计算scipy 2D插值的输出,python,numpy,scipy,Python,Numpy,Scipy,我在网格点x,y处从二维函数f采样数据z,如z=f(x,y) 通过f=interp2d(x,y,z),使用scipy.interp2d插入f 但是,计算f(x,y)会返回一个完整的二维网格,就像我已经计算过一样 xx, yy = np.meshgrid(x, y) f(xx, yy) 我想要的行为是简单地返回范围(len(x))]中I的值[f(x[I],y[I]),我相信这是numpy中几乎所有其他方法的行为 我想要这种行为的原因是,我正在寻找一对(t,u(t))在“时间”内沿着f曲面绘制的路
x,y
处从二维函数f
采样数据z
,如z=f(x,y)
通过f=interp2d(x,y,z
),使用scipy.interp2d
插入f
但是,计算f(x,y)
会返回一个完整的二维网格,就像我已经计算过一样
xx, yy = np.meshgrid(x, y)
f(xx, yy)
我想要的行为是简单地返回范围(len(x))]中I的值[f(x[I],y[I]),我相信这是numpy中几乎所有其他方法的行为
我想要这种行为的原因是,我正在寻找一对(t,u(t))
在“时间”内沿着f
曲面绘制的路径
同样令人惊讶的是,np.diag(f(t,u(t))
不同于np.array([f(ti,u(ti))表示t中的ti])
,因此我不清楚如何从interp2d
返回的路径中找到f(t,u(t))
编辑:关于diag
,我只是觉得我们应该有np.diag(f(t,u(t))==np.array([f(ti,u(ti))表示t中的ti])
,但事实并非如此
完整示例:
def f(t, u):
return (t**2) * np.exp((u**2) / (1 + u**2))
x = np.linspace(0, 1, 250)
xx, yy = np.meshgrid(x, x)
z = f(xx, yy)
f = scipy.interpolate.interp2d(x, y, z)
print(f(x, y))
print(np.array([f(xi, yi)[0] for xi, yi in zip(x, y)]))
我希望两个print
语句的输出是相同的。似乎interp2d()
的行为方式是相同的,因为相应的Fortran函数就是这样构思的。唯一的解决方法(我能想到的)是对坐标对调用f
:
[f(*p)[0] for p in zip(x, y)]
方法interp2d
返回一个对象,该对象的调用方法希望x,y向量是矩形网格的坐标。不能从返回数组的对角线中得到所需值的原因是它首先对x,y进行排序
但有一个变通方法,我也在中使用了。执行后
import scipy.interpolate as si
f = si.interp2d(x, y, z)
不是通过调用它来计算f,而是通过将其tck
属性,后跟x,y坐标传递给内部bispeu
方法来计算f。像这样:
print(si.dfitpack.bispeu(f.tck[0], f.tck[1], f.tck[2], f.tck[3], f.tck[4], x, y)[0])
上面的返回与慢速循环相同
print(np.array([f(xi, yi)[0] for xi, yi in zip(x, y)]))
解释
对象f
是阶数为1的B样条曲线。样条曲线参数(节点、系数、阶数)包含在其tck
属性中,可由低阶例程直接使用以达到所需效果
(理想情况下,f
的调用方法将有一个布尔参数grid
,我们将其设置为False,让它知道我们不需要网格计算。唉,它没有实现。)根据user6655984的建议,我在另一个示例中发布了以下包装函数:
导入scipy.interpolate作为si
def interp2d_对(*args,**kwargs):
“”“与interp2d相同的接口,但返回的Interplant将以成对的值计算其输入。”。
"""
#内部函数计算成对的值,输出与输入具有相同的形状
def插入剂(x、y、f):
x、 y=np.asarray(x),np.asarray(y)
返回(si.dfitpack.bispeu(f.tck[0]、f.tck[1]、f.tck[2]、f.tck[3]、f.tck[4]、x.ravel()、y.ravel())[0])。重塑(x.shape)
#包装scipy interp2函数以调用interplant
返回λx,y:interplant(x,y,si.interp2d(*args,**kwargs))
#创建插入植物(与interp2d相同的界面)
f=interp2d_对(X,Y,Z,kind='cubic')
#计算每对x和y值上的插值
z=f(x,y)
我没有得到与diag
相关的最后一部分。请提供一个可行/可复制的例子。谢谢。如果我在你的两个打印语句之后做以下的事情:<代码>打印(NP.AlelCort(NP.diAG(f(x,y))),NP(数组(f(Xi,Yi)[0,席席,Yi,Zip(x,y)])< /COD> >我得到<代码>真< /代码>。所以我不明白这里的问题是什么。此外,我还必须在f=scipy.interpolate.interp2d(x,y,z)
中替换y->x
。确实如此,但我相信这会慢得多。当我尝试将f
传递到集成例程中时,这也会导致问题,因为它不能很好地混合标量和数组输入。这是使用lambda解决的一个小问题:g=lambda x,y:f(x,y)[0]
和passg
。