Numpy或SciPy Derivative函数用于非均匀间距?

时间:2014-09-16 17:42:35

标签: python numpy scipy derivative

我想知道numpy或scipy是否在他们的库中有一个方法来找到具有非均匀间距的值列表的数值导数。我们的想法是输入与值对应的时间戳,然后使用时间戳来查找数值导数。

5 个答案:

答案 0 :(得分:4)

您可以使用numpy创建自己的函数。对于使用向前差异的衍生产品(编辑感谢@EOL,但请注意 NumPy' s 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包含相应的" times",以便您可以使用任意间隔。

答案 1 :(得分:3)

这可能没有提供,因为你可以做的是取你的因变量的衍生物(y值),取自变量的导数(在你的特定情况下,时间戳),然后除以第一个矢量二。

衍生物的定义是:

f' = dy / dx

或在你的情况下:

f'(t) = dy / dt

您可以使用diff函数计算每个数值dy,diff函数来计算你的数值dt,然后元素除以这些数组以确定每个点的f'(t)。

答案 2 :(得分:2)

这有点晚了,但发现@ 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])

答案 3 :(得分:0)

Scipy的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是导数

的顺序

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

答案 4 :(得分:0)

自最新的NumPy版本(1.13)起,numpy.gradient已实现此功能(documentation):

>>> #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中的值标记y中y值的x坐标。