[英]Given a set of points defined in (X, Y, Z) coordinates, interpolate Z-value at arbitrary (X, Y)
給定(X,Y,Z)坐標中的一組點是表面上的點,我希望能夠在任意(X,Y)坐標處插值Z值。 我發現使用mlab.griddata在網格上插值可以獲得一些成功,但我希望能夠為任何(X,Y)坐標調用通用函數。
這組點形成一個大致半球形的表面。 為了簡化問題,我試圖編寫一種方法,在下面的x,y和z坐標定義的半球的已知點之間插值。 雖然有一個分析解決方案可以找到完美球體的z = f(x,y),這樣你就不需要插值,實際的點集將不是一個完美的球體,所以我們應該假設我們需要在未知(X,Y)坐標處插值。 使用點數據鏈接到IPython筆記本
resolution = 10
u = 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, zs, 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
不幸的是,我得到了非常奇怪的結果,類似於另一個嘗試使用interp2d的 StackOverflow 用戶 。
到目前為止我發現的最大成功是使用反平方來估計(X,Y)處的Z值。 但該函數對於估計Z = 0附近的Z值並不完美。
在給定(x,y,z)中的一組點的情況下,我能做些什么才能得到函數z = f(x, y)
)? 我在這里遺漏了什么......我是否需要更多的點雲來可靠地估算表面上的值?
編輯:
這是我寫完的功能。 該函數使用scipy.interpolate.griddata
在x, y
處獲取xs, ys, zs
輸入數組和插值,這不需要常規網格。 我確信有一種更聰明的方法可以做到這一點,並希望任何更新,但它的工作原理,我不關心性能。 包括一個片段,以防將來幫助任何人。
def interpolate(x, y, xs, ys, zs):
r = np.sqrt(x*x + y*y)
t = np.arctan2(y, x)
rs = np.sqrt(np.multiply(xs, xs) + np.multiply(ys, ys))
ts = np.arctan2(ys, xs)
rs = rs.ravel()
ts = ts.ravel()
zs = zs.ravel()
ts = np.concatenate((ts - np.pi * 2, ts, ts + np.pi * 2))
rs = np.concatenate((rs, rs, rs))
zs = np.concatenate((zs, zs, zs))
Z = scipy.interpolate.griddata((rs, ts), zs, (r, t))
Z = Z.ravel()
R, T = np.meshgrid(r, t)
return Z
你說你嘗試過使用griddata
。 那為什么那不起作用? 如果新點沒有規則間隔, griddata
也可以工作。 例如,
# Definitions of xs, ys and zs
nx, ny = 20, 30
x = np.linspace(0, np.pi, 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 zs
zs = np.cos(3*xs/2.)+np.sin(5*ys/3.)**2
## new points where I want the interpolations
points = np.random.rand(1000, 2)
import scipy.interpolate
zs2 = scipy.interpolate.griddata(np.hstack((xs, ys)), zs, points)
這不是你追求的嗎?
如果我理解你的問題,你有由x定義的點xs
, ys
, zs
xs = np.sin(U) * np.cos(V)
ys = np.sin(U) * np.sin(V)
zs = np.cos(U)
你想要的是能夠插入並找到給定x和y的z值? 你為什么需要插值? 上面的等式代表一個球體,它們可以重寫為xs*xs + ys*ys + zs*zs = 1
,因此這個問題有一個簡單的解析解:
def Z(X, Y):
return np.sqrt(1-X**2-Y**2)
## or return -np.sqrt(1-X**2-Y**2) since this equation has two solutions
除非我誤解了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.