Scipy - 从一个不规则网格到另一个不规则间隔网格的数据插值

时间:2011-08-05 15:39:05

标签: grid 2d scipy interpolation

我正在努力解决两个网格之间的插值问题,而我无法找到适合我问题的解决方案。

我有2个不同的2D网格,其中节点由X和Y坐标定义。网格本身不是矩形,而是形成或多或少的平行四边形(因此(i,j)的X坐标与(i,j + 1)不同,并且(i,j)的Y坐标是与(i + 1,j)的Y坐标不同。 两个网格都有37 * 5的形状,几乎完全重叠。

对于第一个网格,我对每个点都有X坐标,Y坐标和压力值。现在我想在第二个网格上插入第一个网格的压力分布(其中每个点的X和Y也是已知的。

我尝试了不同的插值方法,但由于网格点的不规则分布,我的最终结果永远不会正确。 作为interp2d或griddata的函数需要作为输入的一维数组,但是如果我这样做,插值解是错误的(即使我在原始网格上再次插入来自原始网格的压力值,新的压力值距离原始价值。

对于不同不规则网格上的1D插值,我使用:

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我认为griddata会更容易使用。有没有人有插值的经验,我的输入是网格和数据的2D数组?

1 个答案:

答案 0 :(得分:1)

再看看interp2d。 http://docs.scipy.org/scipy/docs/scipy.interpolate.interpolate.interp2d/#scipy-interpolate-interp2d

请注意'参数'下'x,y'部分中的第二个示例。 'x'和'y'是松散意义上的1-D,但它们可以是扁平阵列。

应该是这样的:

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)'域时,请确保它能够满足您的需求。