Функция Numpy или SciPy для неравномерного интервала?

Мне было интересно, есть ли у numpy или scipy метод в своих библиотеках, чтобы найти числовую производную от списка значений с неравномерным интервалом. Идея состоит в том, чтобы подавать метки времени, соответствующие значениям, а затем для использования временных меток для поиска числовой производной.

    Вы можете создавать свои собственные функции с помощью numpy. Для производных с использованием форвардных различий (редактируйте благодаря @EOL, но обратите внимание, что функция NumPy diff() не является дифференцируемой функцией ):

     def diff_fwd(x, y): return np.diff(y)/np.diff(x) 

    «центральные» различия (это не обязательно центрально, в зависимости от расстояния между данными):

     def diff_central(x, y): x0 = x[:-2] x1 = x[1:-1] x2 = x[2:] y0 = y[:-2] y1 = y[1:-1] y2 = y[2:] f = (x2 - x1)/(x2 - x0) return (1-f)*(y2 - y1)/(x2 - x1) + f*(y1 - y0)/(x1 - x0) 

    где y содержит оценки функций и x соответствующие «времена», так что вы можете использовать произвольный интервал.

    Это, вероятно, не предусмотрено, потому что вместо этого вы можете взять производную от вашей зависимой переменной (значения y), взять производную от вашей независимой переменной (в вашем конкретном случае, временные метки), а затем разделить первый вектор на второй ,

    Определение производной:

     f' = dy / dx 

    или в вашем случае:

     f'(t) = dy / dt 

    Вы можете использовать функцию diff, чтобы вычислить каждую из ваших числовых dy, функцию diff, чтобы вычислить ваш численный dt, а затем элемент разделите эти массивы, чтобы определить f '(t) в каждой точке.

    Это немного запоздало, но нашел ответ @ dllahr очень полезным и простым в использовании с numpy :

     >>> import numpy as np >>> y = [1, 2, 3, 4, 5] >>> dy = np.gradient(y) >>> x = [1, 2, 4, 8, 10] >>> dx = np.gradient(x) >>> dy/dx array([1., 0.66666667, 0.33333333, 0.33333333, 0.5]) 

    UnivariateSpline.derivative от UnivariateSpline.derivative – это простой способ найти производную любого набора данных (ось x должна быть упорядочена так, чтобы она возрастала).

     x = [1, 3, 8, 10] y = [0, 8, 12, 4] z = scipy.interpolate.UnivariateSpline.derivative(x,y) dz = z.derivative(n) 

    где n – порядок производной

    ref: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.UnivariateSpline.derivative.html

    Поскольку новая версия NumPy (1.13), numpy.gradient имеет эту функцию, реализованную ( документацию ):

     >>> #only numpy 1.13 and above >>> import numpy as np >>> y = [1, 3, 4, 6, 11] >>> x = [0, 1, 5, 10, 11] >>> np.gradient(y, x) array([ 2. , 1.65 , 0.31666667, 4.23333333, 5. ]) 

    Здесь значения в x отмечают x-координаты y-значений по y .