我正在为两个网格之间的插值而苦苦挣扎,我无法为我的问题找到合适的解决方案。
我有两个不同的2D网格,其中的节点点由它们的X和Y坐标定义。网格本身不是矩形的,而是大致形成一个平行四边形(因此,(i,j)的X坐标与(i,j+1)的X坐标不同,(i,j)的Y坐标与(i+1,j)的Y坐标不同。这两个网格都有37*5的形状,它们几乎完全重叠。
对于第一个网格,我有每个点的X坐标,Y坐标和压力值。现在我想在第二个网格上插值第一个网格的压力分布(每个点的X和Y也是已知的)。
我尝试了不同的插值方法,但由于网格点的不规则分布,我的最终结果从来都不正确。作为interp2d或griddata的函数需要一维数组作为输入,但如果我这样做,插值的解决方案是错误的(即使我在原始网格上再次插值来自原始网格的压力值,新的压力值也与原始值相差数英里。
对于不同不规则网格上的一维插值,我使用:
def interpolate(X, Y, xNew):
if xNew<X[0]:
print 'Interp Warning :', xNew,'is under the interval [',X[0],',',X[-1],']'
yNew = Y[0]
elif xNew>X[-1]:
print 'Interp Warning :', xNew,'is above the interval [',X[0],',',X[-1],']'
yNew = Y[-1]
elif xNew == X[-1] : yNew = Y[-1]
else:
ind = numpy.argmax(numpy.bitwise_and(X[:-1]<=xNew,X[1:]>xNew))
yNew = Y[ind] + ((xNew-X[ind])/(X[ind+1]-X[ind]))*(Y[ind+1]-Y[ind])
return yNew
但对于2D,我认为网格数据会更容易使用。有没有人有插值的经验,我的输入是网格和数据的二维数组?
发布于 2012-07-08 22:36:45
再看一看interp2d。http://docs.scipy.org/scipy/docs/scipy.interpolate.interpolate.interp2d/#scipy-interpolate-interp2d
请注意“参数”下“x,y”部分中的第二个示例。“x”和“y”是松散意义上的一维,但它们可以是扁平化的数组。
应该是这样的:
f = scipy.interpolate.interp2d([0.25, 0.5, 0.27, 0.58], [0.4, 0.8, 0.42,0.83], [3, 4, 5, 6])
znew = f(.25,.4)
print znew
[ 3.]
znew = f(.26,.41) # midway between (0.25,0.4,3) and (0.27,0.42,5)
print znew
[ 4.01945345] # Should be 4 - close enough?
我本以为可以将扁平化的'xnew‘和'ynew’数组传递给'f()‘,但我无法让它工作。不过,'f()‘函数将接受行和列的语法,这对您没有什么用处。由于'f()‘的这个限制,你必须将'znew’作为循环的一部分来计算--可能应该看看nditer。当'(xnew,ynew)‘在'(x,y)’域外时,还要确保它能做你想做的事情。
https://stackoverflow.com/questions/6958931
复制相似问题