2015-09-23 3 views
3

Я новичок в Python. Я пытаюсь интерполировать значения данных из набора данных, который выглядит следующим образом: a = [45.0,0.0017317314, -0.00274, ...] [45.07,0.00173326, -0.002278, ...] . . .Интерполировать данные с несколькими столбцами

Я хочу найти значения данных от второго до последнего столбца при определенных значениях данных в первом столбце.

Я попытался следующий код:

interp_data = np.interp(45.01,a[:,0],a[:,1]) 

в качестве начальной попытки найти значение одной точки данных для одного столбца. Тем не менее, он возвращает ошибку «объект слишком глубоко для требуемого массива»

Однако следующие работы в оболочке

>>> xp = [45.0, 45.074969417037, 45.224757625296, 45.523726383073] 

>>> fp = [1.73145123922036E-002, 1.73326024230735E-002, 1.73689532454203E-002, 1.74423417607930E-002] 

>>> import numpy 

>>> numpy.interp(45.1, xp, fp) 

0.017338676881704793 

Кроме того, я хотел бы сделать это для нескольких значений, как:

for i in range(len(a)): 

for j in range(a.shape[1]): 
    interp_data = np.interp(values,a[:,j],a[:,j]) 

где значения - это массив точек данных, в которые я хочу интерполировать.

ответ

0

Эта ошибка, вероятно, вызвана тем, что вы являетесь другой формой, чем вы ожидаете. Я получаю:

>>> a = np.zeros((10,2)) 
>>> print np.interp(0,a[:,0],a[:,1]) 
0.0 

>>> a = np.zeros((10,2,3)) #note incorrect shape 
>>> print np.interp(0,a[:,0],a[:,1]) 
ValueError: object too deep for desired array 

После того, как вы получите форму выяснял вы можете просто сделать

points = #the 1D array of data points you want to interpolate to 
interp_data = np.interp(points,a[:,0],a[:,1]) 

Заметим также, что np.interp даст вам только линейная интерполяция. Для более сложных интерполяций вам нужно использовать scipy.interpolate (что фантастично!). Я большой поклонник UnivariateSpline.

+0

Да, я думаю, что это форма, как мой массив из выглядит следующим образом: [[0,01731451] [0,0173326] [0,01736895]] вместо [0,01731454, 0,0173326 ...] Я думаю, мне нужно распаковать элементов из массива. Есть идеи? – Afzal

0

Проблема в том, что вы пытаетесь ввести список неверным образом. Доступ к спискам осуществляется с помощью [1] [:] (например,). При этом вы получите все значения второго элемента списка. В качестве примера, вы можете сделать это:

xp = [0,1,2,3,4] 
fp = [[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]] 
np.interp(1.5,xp,fp[0]) 
3.5 
np.interp(1.5,xp,fp[1]) 
4.5 
np.interp(1.5,xp,fp[2]) 
5.5 

Так что, если вы хотите, чтобы все ваши Y данные в списке, вам просто нужно, чтобы получить доступ к первому элементу списка и вы получите доступ к данным, содержащимся в первый элемент списка, что-то вроде, если вы обращаетесь к первой строке массива, вы получаете все данные, содержащиеся во всех столбцах, разница в том, что вам не нужно указывать (1, :) только [1] для «вторая строка» обработчика.

Смежные вопросы