Scipy - интерполяция данных из одной нерегулярной сетки в другую нерегулярную разнесенную сетку - PullRequest
3 голосов
/ 05 августа 2011

Я борюсь с интерполяцией между двумя сетками и не смог найти подходящего решения для моей проблемы.

У меня есть 2 разных 2D сетки, из которых точки узлов определяются их координатами X и Y. Сама сетка не является прямоугольной, но образует более или менее параллелограмм (поэтому координата X для (i, j) не совпадает с (i, j + 1), а координата Y для (i, j) равна отличается от координаты Y (i + 1, j). Обе сетки имеют форму 37 * 5 и почти полностью перекрывают друг друга.

Для первой сетки у меня есть для каждой точки координата X, координата Y и значение давления. Теперь я хотел бы интерполировать это распределение давления первой сетки на второй сетке (из которых также известны X и Y для каждой точки.

Я пробовал разные методы интерполяции, но мой конечный результат никогда не был правильным из-за нерегулярного распределения точек сетки. Функции как interp2d или griddata требуют в качестве входных данных массива 1D, но если я сделаю это, интерполированное решение будет неправильным (даже если я снова интерполирую значения давления из исходной сетки на исходную сетку, новые значения давления находятся в милях от исходные значения.

Для 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 будет проще в использовании. У кого-нибудь есть опыт интерполяции, где мой вход представляет собой двумерный массив для сетки и данных?

1 Ответ

1 голос
/ 08 июля 2012

Посмотрите еще раз на 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).

...