Как вы интерполируете двумерные данные с уникальными массивами y для каждого значения массива x в Python? - PullRequest
1 голос
/ 07 ноября 2019

Я изо всех сил пытаюсь создать интерполяционную функцию для некоторых двухмерных данных, которые у меня есть. Мои данные не являются стандартными, поскольку каждое значение в массиве x соответствует уникальному массиву y. Например:

x = [0.1, 0.2]

y1 = [13.719, 10.488, 9.885, 9.704]       #Corresponding to x=0.1

y2 = [13.34, 10.259,  9.275,  8.724]      #Corresponding to x=0.2

z1 = [1395., 2209., 2411., 2555.]         #Corresponding to y1

z2 = [1570., 2261., 2519., 2682.]         #Corresponding to y2

В идеале я хотел бы сгенерировать функцию f (x, y), которая будет возвращать интерполированное значение z.

До сих пор мои единственные попытки были связаны с использованием:

from scipy.interpolate import interp2d

interpolation = interp2d(x, [y1, y2], [z1, z2])

Что неудивительно, что приводит к следующему сообщению об ошибке:

ValueError: x and y must have equal lengths for non rectangular grid

Я понимаю, почему яполучаю это сообщение и понимаю, что interp2d - это не та функция, которую я должен использовать, но я не уверен, куда идти.

1 Ответ

1 голос
/ 07 ноября 2019

Проблема в том, что interp2d работает с данными, расположенными на прямоугольной сетке. У вас есть только 8 точек данных, которые не расположены в прямоугольной сетке xy.

Можно рассмотреть прямоугольник 2x8, который состоит из всех возможных комбинаций ваших данных x и y, но у вас есть только 8 точек данных (значения z).

Ниже приведен пример решения с более общей функцией scipy.interpolate.griddata:

x = [0.1, 0.2]
y1 = [13.719, 10.488, 9.885, 9.704]       #Corresponding to x=0.1
y2 = [13.34, 10.259,  9.275,  8.724]      #Corresponding to x=0.2
z1 = [1395., 2209., 2411., 2555.]         #Corresponding to y1
z2 = [1570., 2261., 2519., 2682.]         #Corresponding to y2

y=np.concatenate((y1,y2))  # collapse all y-data into a single array

# obtain x- and y- grids
grid_x, grid_y =np.meshgrid(np.array(x), y)[0].T, np.meshgrid(np.array(x), y)[1].T
points=np.stack((np.repeat(x,4).T,y))  #obtain xy corrdinates for data points
values=np.concatenate((z1,z2)) #obtain values 
grid_z0 = griddata(points.T, values, (grid_x, grid_y), method='nearest') #Nearest neighbour interpolation

Этот код можно обобщить для других параметров интерполяции / более плотных сеток и т. Д.

...