python - numpy 中的二阶梯度

标签 python numpy scipy

我正在尝试计算 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/

相关文章:

具有很少非零(非常稀疏)的 Python 洗牌数组

python - numpy 的 bincount 函数的反函数

python - numpy.polyfit 与 scipy.odr

python - 求解稀疏上三角系统

python - 重复 Scipy 的 griddata

python - 从多个 txt 文件中读取 - 剥离数据并保存到 xls

python数学,numpy模块不同的结果?

python - 在 Windows 10 上为 PyPy3 安装 numpy 时出现问题

python - Pandas - 添加列,匹配索引

python - 使用带有设备名称的 pyudev 检索 USB 信息