我正在尝试计算 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() 是玩具数据 - 真实数据没有解析形式。
谢谢!
最佳答案
我会附上@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 中不存在。
请注意,正如@JosephCottham 在 2018 年的评论中指出的那样,这个答案(至少对 Numpy 1.08 有好处)不再适用,因为(至少)Numpy 1.14。检查您的版本号和调用的可用选项。
关于python - numpy 中的二阶梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23419193/