Python Сохранять точки в сплайн-интерполяции

Я написал код, выполняющий сплайн-интерполяцию:

x1 = [ 0., 13.99576991, 27.99153981, 41.98730972, 55.98307963, 69.97884954, 83.97461944, 97.97038935, 111.9661593, 125.9619292, 139.9576991, 153.953469 ]
y1 = [ 1., 0.88675318, 0.67899118, 0.50012243, 0.35737022, 0.27081293, 0.18486778, 0.11043095, 0.08582272, 0.04946131, 0.04285015, 0.02901567]

x = np.array(x1) 
y = np.array(y1)

# Interpolate the data using a cubic spline to "new_length" samples
new_length = 50
new_x = np.linspace(x.min(), x.max(), new_length)
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x)

Но в новом наборе данных, сгенерированном new_x и new_y, исходные точки удаляются, сохраняются только первое и последнее значения. Я хотел бы сохранить исходные точки.


person Hellfish    schedule 09.08.2012    source источник
comment
почему бы тебе не сделать это new_y = sp.interpolate.interp1d(x, y, kind='cubic')(x)   -  person Theodros Zelleke    schedule 09.08.2012


Ответы (2)


Правильно, linspace не будет генерировать никаких значений в x, кроме тех, которые вы ему передадите (x.min() и x.max()).

У меня нет отличного быстрого ответа, но вот один из способов сделать это:

# Interpolate the data using a cubic spline to "new_length" samples
new_length = 50
interpolated_x = np.linspace(x.min(), x.max(), new_length - len(x) + 2)
new_x = np.sort(np.append(interpolated_x, x[1:-1]))  # include the original points
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x)

Этот код использует:

  • np.linspace чтобы создать столько дополнительных точек, сколько нам нужно
  • np.append, чтобы объединить массив дополнительных точек с исходными точками из x
  • np.sort чтобы упорядочить объединенный массив
person Jason Orendorff    schedule 09.08.2012

Если ваши данные однородны, это другой способ:

import numpy as np

def interpolate_add(x_add,num):
    x_add_ls=[]
    for i in range(x_add.shape[0]-1):
        x_add_ls += (np.linspace(x_add[i],x_add[i+1],num+2)[0:-1]).tolist()
    x_add_ls.append(x[-1])    
    return np.array(x_add_ls)

x=np.linspace(1,5,5)
print(x)
print(interpolate_add(x,3))

он печатает:

<сильный>[1. 2. 3. 4. 5.]

<сильный>[1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. ]

В коде interpolate_add имеет два параметра

  • x_add - ваши данные (numpy.array). Форма данных (N,)

  • num — это номер вставляемых данных между двумя исходными данными.

Например, если ваши данные array([1, 3]), а num равно 1, результат будет array([1, 2, 3]).

person skydomain    schedule 22.10.2018