2014-05-02 39 views
3

我正在努力计算numpy中数组的二阶梯度。numpy中的二阶梯度

a = np.sin(np.arange(0, 10, .01)) 
da = np.gradient(a) 
dda = np.gradient(da) 

这就是我想到的。它应该怎样完成?

我在问这个问题,因为在numpy中没有选项说np.gradient(a,order = 2)。我担心这种用法是否是错误的,这就是numpy没有实现的原因。

PS1:我知道有np.diff(a,2)。但这只是单方面的估计,所以我很好奇np.gradient为什么没有类似的关键字。

PS2:np.sin()是玩具数据 - 真实数据没有分析形式。

谢谢!

+2

您可以使用卷积与高斯内核的二阶导数:http://stackoverflow.com/a/18993405/1730674 – askewchan

回答

3

数值梯度计算没有普遍的正确答案。在计算关于样本数据的渐变之前,您必须对生成该数据的基础函数做出一些假设。您可以在技术上使用np.diff进行梯度计算。使用np.gradient是一种合理的方法。我没有发现你在做什么有什么根本性的错误 - 这是一维函数的二阶导数的一个特别的近似值。

5

我会第二@ jrennie的第一句话 - 它可以都依赖。 numpy.gradient函数要求数据均匀分布(尽管如果多维的话每个方向允许不同的距离)。如果你的数据不符合这个要求,那么numpy.gradient不会有太大用处。实验数据可能会有(确定,将会)噪声,除此之外不一定均匀分布。在这种情况下,使用其中一个scipy.interpolate样条函数(或对象)可能会更好。这些可以采取不均匀间隔的数据,允许平滑,并且可以返回高达k-1的导数,其中k是所要求的样条拟合的阶数。 k的默认值是3,所以二阶导数就好了。 实施例:

spl = scipy.interpolate.splrep(x,y,k=3) # no smoothing, 3rd order spline 
ddy = scipy.interpolate.splev(x,spl,der=2) # use those knots to get second derivative 

面向对象的花键等scipy.interpolate.UnivariateSpline具有用于衍生物的方法。请注意,派生方法在Scipy 0.13中实现,并且不存在于0.12中。

0

这是从原始文件摘录(在撰写本文时发现在http://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html)。它规定,除非采样距离为1,否则需要包含一个包含距离的列表作为参数。

numpy.gradient(f, *varargs, **kwargs) 

返回一个N维阵列的梯度。

使用内部的二阶准确中心差和边界上的一阶差分或二阶精度单侧(向前或向后)差异来计算梯度。返回的渐变因此具有与输入数组相同的形状。

参数:
f:array_like 包含标量函数样本的N维数组。标准列表,可选 N个标量,指定每个维度的样本距离,即dx,dy,dz,...默认距离:1。

edge_order:{1,2},可选 使用边界处的N阶精度差计算梯度。默认值:1. 版本1.9.1中的新功能。

返回:
渐变:ndarray N个与f形状相同的阵列,给出f对每个维度的导数。