Spec-Zone.ru › NumPy 1.13

numpy.gradient

numpy.gradient(f, *varargs, **kwargs) [source]

Возвращает градиент N-мерного массива.

Градиент вычисляется с использованием центральных разностей второго порядка во внутренних точках и разностей первого или второго порядка (вперед или назад) на границах. Возвращаемый градиент имеет ту же форму, что и входной массив.

Параметры:

f : array_like

N-мерный массив, содержащий образцы скалярной функции.

varargs : список скаляров или массивов, необязательно

Интервал между значениями f. По умолчанию единичный интервал для всех измерений. Шаг может быть задан:

  1. одним скаляром для задания расстояния между образцами для всех измерений.
  2. N скалярами для задания постоянного расстояния между образцами для каждого измерения. Например, dx, dy, dz, ...
  3. N массивами для задания координат значений по каждому измерению массива F. Длина массива должна соответствовать размеру соответствующего измерения
  4. Любая комбинация 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.

Примечания

Предполагая, что 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}) в их разложение в ряд Тейлора, это приводит к решению следующей системы линейных уравнений:

\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.

Полученное приближение 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)

Аналогичным образом можно вывести приближения вперед/назад, используемые для границ.

Ссылки

[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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API