numpy.gradient()

您所在的位置:网站首页 gradient怎么算python numpy.gradient()

numpy.gradient()

2024-03-12 05:38| 来源: 网络整理| 查看: 265

返回 N 维数组的梯度。

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

Parameters farray_like

包含标量函数样本的 N 维数组。

标量或数组的 varargslist,可选

f 值之间的间距。所有尺寸的默认统一间距。可以使用以下方式指定间距:

单个标量指定所有维度的样本距离。 N 个标量,用于指定每个维度的恒定样本距离。即 dx 、 dy 、 dz 、…… N 个数组,用于指定 F 的每个维度上的值的坐标。数组的长度必须与相应维度的大小匹配 具有 2. 和 3. 含义的 N 个标量/数组的任意组合。

如果给出 axis ,则可变参数的数量必须等于轴的数量。默认值:1。

边缘顺序{1, 2},可选

使用边界处的 N 阶精确差来计算梯度。默认值:1。

1.9.1 版本中的新增功能。

axisNone 或 int 或整数元组,可选

仅沿给定的一个或多个轴计算梯度默认值(轴=无)是计算输入数组的所有轴的梯度。axis 可能为负数,在这种情况下,它从最后一个轴开始计数到第一个轴。

1.11.0 版本中的新增功能。

Returns 梯度ndarray或ndarray列表

与 f 对每个维度的导数相对应的 ndarray 列表(如果只有一维,则为单个 ndarray)。每个导数具有与 f 相同的形状。

Notes

假设 \(f\in C^{3}\) (即 \(f\) 至少有 3 个连续导数)并令 \(h_{*}\) 为非齐次步长,我们最小化“ true 梯度与其相邻网格点线性组合的估计值之间的一致性误差”\(\eta_{i}\):

\[\eta_{i} = f_{i}^{\left(1\right)} - \left[ \alpha f\left(x_{i}\right) + \beta f\left(x_{i} + h_{d}\right) + \gamma f\left(x_{i}-h_{s}\right) \right]\]

通过将 \(f(x_{i} + h_{d})\) 和 \(f(x_{i} - h_{s})\) 替换为其泰勒级数展开式,这转化为求解以下线性系统:

\[\begin{split}\left\{ \begin{array}{r} \alpha+\beta+\gamma=0 \\ \beta h_{d}-\gamma h_{s}=1 \\ \beta h_{ d}^{2}+\gamma h_{s}^{2}=0 \end{array} \right.\end{split}\]

\(f_{i}^{(1)}\) 的近似结果如下:

\[\hat f_{i}^{(1)} = \frac{ h_{s}^{2}f\left(x_{i} + h_{d}\right) + \left(h_{d} ^{2} - h_{s}^{2}\right)f\left(x_{i}\right) - h_{d}^{2}f\left(x_{i}-h_{s}\右)} { h_{s}h_{d}\left(h_{d} + h_{s}\right)} + \mathcal{O}\left(\frac{h_{d}h_{s}^{ 2} + h_{s}h_{d}^{2}}{h_{d} + h_{s}}\右)\]

值得注意的是,如果 \(h_{s}=h_{d}\) (即数据均匀分布),我们找到标准二阶近似:

\[\hat f_{i}^{(1)}= \frac{f\left(x_{i+1}\right) - f\left(x_{i-1}\right)}{2h} + \mathcal{O}\left(h^{2}\right)\]

通过类似的过程,可以导出用于边界的前向/后向近似值。

References 1

Quarteroni A.、Sacco R.、Saleri F. (2007) 数值数学(应用数学教材)。纽约:施普林格。

2

Durran DR (1999) 地球物理流体动力学中波动方程的数值方法。纽约:施普林格。

3

Fornberg B. (1988) 任意间隔网格上的有限差分公式的生成,计算数学 51,第 1 期。184:699-706。 PDF 。

Examples >>> f = np.array([1, 2, 4, 7, 11, 16], dtype=float) >>> np.gradient(f) array([1. , 1.5, 2.5, 3.5, 4.5, 5. ]) >>> np.gradient(f, 2) array([0.5 , 0.75, 1.25, 1.75, 2.25, 2.5 ])

还可以使用表示值 F 沿维度的坐标的数组来指定间距。例如均匀间距:

>>> x = np.arange(f.size) >>> np.gradient(f, x) array([1. , 1.5, 2.5, 3.5, 4.5, 5. ])

或者是非统一的:

>>> x = np.array([0., 1., 1.5, 3.5, 4., 6.], dtype=float) >>> np.gradient(f, x) array([1. , 3. , 3.5, 6.7, 6.9, 2.5])

对于二维数组,返回将是按轴排序的两个数组。在此示例中,第一个数组代表行方向的梯度,第二个数组代表列方向的梯度:

>>> np.gradient(np.array([[1, 2, 6], [3, 4, 5]], dtype=float)) [array([[ 2., 2., -1.], [ 2., 2., -1.]]), array([[1. , 2.5, 4. ], [1. , 1. , 1. ]])]

在此示例中,还指定了间距:轴 = 0 时均匀,轴 = 1 时非均匀

>>> dx = 2. >>> y = [1., 1.5, 3.5] >>> np.gradient(np.array([[1, 2, 6], [3, 4, 5]], dtype=float), dx, y) [array([[ 1. , 1. , -0.5], [ 1. , 1. , -0.5]]), array([[2. , 2. , 2. ], [2. , 1.7, 0.5]])]

可以使用 edge_order 指定如何处理边界

>>> x = np.array([0, 1, 2, 3, 4]) >>> f = x**2 >>> np.gradient(f, edge_order=1) array([1., 2., 4., 6., 7.]) >>> np.gradient(f, edge_order=2) array([0., 2., 4., 6., 8.])

axis 关键字可用于指定计算梯度的轴子集

>>> np.gradient(np.array([[1, 2, 6], [3, 4, 5]], dtype=float), axis=0) array([[ 2., 2., -1.], [ 2., 2., -1.]])


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3