numpy.gradient
-
numpy.gradient(f, *varargs, **kwargs)[source] -
Возвращает градиент N-мерного массива.
Градиент вычисляется с использованием центральных разностей второго порядка во внутренних точках и разностей первого или второго порядка (вперед или назад) на границах. Возвращаемый градиент имеет ту же форму, что и входной массив.
Параметры: f : array_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.
axis : None или int или кортеж из целых чисел, необязательно
Градиент вычисляется только по заданной оси или осям. По умолчанию (axis = None) вычисляется градиент по всем осям входного массива. axis может быть отрицательным, в этом случае он считается от последней до первой оси.
Новое в версии 1.11.0.
Возвращает: gradient : ndarray или список ndarray
Набор ndarrays (или один ndarray, если размерность только одна), соответствующий производным f по каждому измерению. Каждая производная имеет ту же форму, что и f.
Примечания
Предполагая, что
(т.е.,
имеет как минимум 3 непрерывные производные) и пусть
является неоднородным шагом, расстояние, по которому вычисляются коэффициенты конечных разностей, определяется путем минимизации погрешности согласованности
. ![\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]](https://docs.scipy.org/doc/numpy-1.13.0/_images/math/64fdea68480b0d880ce5e2670ac0b03594656469.png)
Подставляя
и
в их разложение в ряд Тейлора, это приводит к решению следующей системы линейных уравнений:
Полученное приближение
имеет следующий вид:
Стоит отметить, что если
(т.е., данные равномерно распределены), мы получаем стандартное приближение второго порядка:
Аналогичным образом можно вывести приближения вперед/назад, используемые для границ.
Ссылки
[R21] Quarteroni A., Sacco R., Saleri F. (2007) Численные методы (Тексты по прикладной математике). Нью-Йорк: Springer. [R22] Durran D. R. (1999) Численные методы для волновых уравнений в геофизической динамике. Нью-Йорк: Springer. [R23] Fornberg B. (1988) Генерация формул конечных разностей на произвольно распределенных сетках, Математика вычислений 51, № 184: 699-706. PDF. Примеры
>>> f = np.array([1, 2, 4, 7, 11, 16], dtype=np.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=np.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=np.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=np.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=np.float), axis=0) array([[ 2., 2., -1.], [ 2., 2., -1.]])
© 2008–2017 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.gradient.html