python– 给定一组在(X,Y,Z)坐标中定义的点,在任意(X,Y)处插入Z值

python– 给定一组在(X,Y,Z)坐标中定义的点,在任意(X,Y)处插入Z值,第1张

概述给定(X,Y,Z)坐标中的一组点是表面上的点,我希望能够在任意(X,Y)坐标处插值Z值.我发现使用mlab.griddata在网格上插值可以获得一些成功,但我希望能够为任何(X,Y)坐标调用通用函数.这组点形成一个大致半球形的表面.为了简化问题,我试图编写一种方法,在下面的x,y和z坐标定义的半球的已知点之间插值.虽然有一个分析解决方案可以找到完美球体的z

给定(X,Y,Z)坐标中的一组点是表面上的点,我希望能够在任意(X,Y)坐标处插值Z值.我发现使用mlab.grIDdata在网格上插值可以获得一些成功,但我希望能够为任何(X,Y)坐标调用通用函数.

这组点形成一个大致半球形的表面.为了简化问题,我试图编写一种方法,在下面的x,y和z坐标定义的半球的已知点之间插值.虽然有一个分析解决方案可以找到完美球体的z = f(x,y),这样你就不需要插值,实际的点集将不是一个完美的球体,所以我们应该假设我们需要在未知(X,Y)坐标处插值. Link to IPython notebook with point data

resolution = 10u = np.linspace(-np.pi / 2,np.pi / 2,resolution)v = np.linspace(0,np.pi,resolution)U,V = np.meshgrID(u,v)xs = np.sin(U) * np.cos(V) ys = np.sin(U) * np.sin(V)zs = np.cos(U)

我一直在使用scipy.interpolate.interp2d,它“返回一个函数,其调用方法使用样条插值来查找新点的值.”

def polar(xs,ys,zs,resolution=10):    rs = np.sqrt(np.multiply(xs,xs) + np.multiply(ys,ys))    ts = np.arctan2(ys,xs)    func = interp2d(rs,ts,kind='cubic')    vectorized = np.vectorize(func)    # Guesses    ri = np.linspace(0,rs.max(),resolution)    ti = np.linspace(0,np.pi * 2,resolution)    R,T = np.meshgrID(ri,ti)    Z = vectorized(R,T)    return R * np.cos(T),R * np.sin(T),Z

不幸的是,我得到了非常奇怪的结果,类似于另一个StackOverflow user who tried to use interp2d.

到目前为止我发现的最大成功是使用inverse squares估算(X,Y)处的Z值.但该函数对于估计Z = 0附近的Z值并不完美.

在给定(x,y,z)中的一组点的情况下,我能做些什么才能得到函数z = f(x,y)?我在这里遗漏了什么……我是否需要更多的点云来可靠地估算表面上的值?

编辑:

这是我写完的功能.该函数使用scipy.interpolate.grIDdata获取x,z的输入数组,并在x,y处插值,不需要常规网格.我确信有一种更聪明的方法可以做到这一点,并希望任何更新,但它的工作原理,我不关心性能.包括一个片段,以防将来帮助任何人.

def interpolate(x,xs,zs):    r = np.sqrt(x*x + y*y)    t = np.arctan2(y,x)    rs = np.sqrt(np.multiply(xs,xs)    rs = rs.ravel()    ts = ts.ravel()    zs = zs.ravel()    ts = np.concatenate((ts - np.pi * 2,ts + np.pi * 2))    rs = np.concatenate((rs,rs,rs))    zs = np.concatenate((zs,zs))    Z = scipy.interpolate.grIDdata((rs,ts),(r,t))    Z = Z.ravel()    R,T = np.meshgrID(r,t)    return Z
最佳答案你说你尝试过使用grIDdata.那为什么那不起作用?如果新点没有规则间隔,grIDdata也可以工作.例如,

# DeFinitions of xs,ys and zsnx,ny = 20,30x = np.linspace(0,nx)y = np.linspace(0,2*np.pi,ny)X,Y = np.meshgrID(x,y)xs = X.reshape((nx*ny,1))ys = Y.reshape((nx*ny,1))## Arbitrary deFinition of zszs = np.cos(3*xs/2.)+np.sin(5*ys/3.)**2## new points where I want the interpolationspoints = np.random.rand(1000,2)import scipy.interpolatezs2 = scipy.interpolate.grIDdata(np.hstack((xs,ys)),points)

这不是你追求的吗? 总结

以上是内存溢出为你收集整理的python – 给定一组在(X,Y,Z)坐标中定义的点,在任意(X,Y)处插入Z值全部内容,希望文章能够帮你解决python – 给定一组在(X,Y,Z)坐标中定义的点,在任意(X,Y)处插入Z值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存