Организуйте фрейм данных Pandas для использования в scipy interpn

#python #pandas #scipy #interpolation

Вопрос:

Я должен выполнить интерполяцию в 3 или 4 измерениях, перемещаясь из табличных данных, хранящихся в виде Панд DataFrame . У меня есть следующие данные, хранящиеся в переменной df : DataFrame :

  xm   xA   xl      z     
2.3  4.6  10.0   1.905
2.3  4.6  11.0   1.907
2.3  4.8  10.0   1.908
2.3  4.8  11.0   1.909
2.4  4.6  10.0   1.811
2.4  4.6  11.0   1.812
2.4  4.8  10.0   1.813
2.4  4.8  11.0   1.814
 

xm, xa, xl являются осью, от которой должна быть отрисована сетка. Столбец z содержит значения, из которых должна выполняться интерполяция. Действительно, обычная сетка, которую я придумал, рассчитывается как:

 grid = np.meshgrid(*(df.xm,df.xA,df.xl))
 

Теперь моя проблема заключается в том, как превратить данные серии Z из кадра данных в np.массив, который будет передан функции Scipy:

 from scipy import interpolate
p0 = (xm0,xA0,xl0)
z0 = interpolate.interpn(grid, myarray, p0)
 

Комментарии:

1. grid = np.meshgrid(*(df.xm,df.xA,df.xl)) ? Это не то же самое, что grid = np.meshgrid(df.xm,df.xA,df.xl)

2. Я думаю, вы можете использовать что-то вроде df.z.values.reshape(grid[0].shape) .

Ответ №1:

Спасибо SCKU за подсказку по изменению формы z-столбца. Я использовал

 grid = np.meshgrid(*(df.xm,df.xA,df.xl))
 

следуя примеру из документа scipy.
На самом деле этого было достаточно, чтобы передать кортеж массива базовых осей:

 grid = np.meshgrid(xm,xA,xLn)
z = df.z.values.reshape(grid[0].shape)
xt = (df.xM,df.xA,df.xLn)
p0 = (xM0,xA0,xLn0)
val = interpolate.interpn(xt, z, p0)
 

Комментарии:

1. Спасибо за информацию, по ссылке scipy doc, я думаю, что они используют points = (x, y, z) и np.meshgrid(*points) для улучшения читаемости (математика).