numpy.gradient
- numpy.gradient(f, *varargs, axis=None, edge_order=1)[source]
-
Возвращает градиент N-мерного массива.
Градиент вычисляется с использованием центральных разностей второго порядка во внутренних точках и либо разностей первого или второго порядка (вперед или назад) на границах. Полученный градиент имеет ту же форму, что и входной массив.
- Параметры:
-
- farray_like
-
N-мерный массив, содержащий образцы скалярной функции.
- varargsсписок скаляров или массивов, необязательно
-
Интервал между значениями f. По умолчанию единичный интервал для всех измерений. Интервал может быть указан с помощью:
- одиночного скаляра для указания расстояния между образцами для всех измерений.
- N скаляров для указания постоянного расстояния между образцами для каждого измерения. Например,
dx,dy,dz, … - N массивов для указания координат значений вдоль каждого измерения F. Длина массива должна соответствовать размеру соответствующего измерения
- Любое сочетание N скаляров/массивов со значением 2. и 3.
Если
axisзадано, количество varargs должно равняться количеству осей. По умолчанию: 1. - edge_order{1, 2}, необязательно
-
Градиент вычисляется с использованием разностей N-го порядка на границах. По умолчанию: 1.
Введено в версии 1.9.1.
- axisNone или int или кортеж из целых чисел, необязательно
-
Градиент вычисляется только по заданной оси или осям. По умолчанию (axis = None) вычисляется градиент по всем осям входного массива. axis может быть отрицательным, в этом случае он отсчитывается от последней до первой оси.
Введено в версии 1.11.0.
- Возвращаемое значение:
-
- gradientndarray или список ndarray
-
Список ndarray (или один ndarray, если есть только одно измерение), соответствующий производным f по каждому измерению. Каждая производная имеет ту же форму, что и f.
Примечания
Предполагая, что \(f\in C^{3}\) (т.е., \(f\) имеет по крайней мере 3 непрерывные производные) и пусть \(h_{*}\) будет неоднородным шагом, мы минимизируем «ошибку согласованности» \(\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}\right)} { 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}}\right)\]Стоит отметить, что если \(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)\]Аналогичным образом можно получить приближения вперед/назад, используемые для границ.
Ссылки
[1]Кватеррони А., Саччо Р., Салери Ф. (2007) Численные методы (Тексты по прикладной математике). Нью-Йорк: Спрингер.
[2]Дурран Д. Р. (1999) Численные методы для волновых уравнений в геофизической динамике. Нью-Йорк: Спрингер.
[3]Форнберг Б. (1988) Генерация формул конечных разностей на произвольно расположенных сетках, Математика вычислений 51, № 184: 699-706. PDF.
Примеры
>>> 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. ]])]В этом примере интервал также указан: равномерный для axis=0 и неравномерный для axis=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.]])
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.gradient.html