Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 沿曲线计算scipy 2D插值的输出_Python_Numpy_Scipy - Fatal编程技术网

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]
和pass
g