numpy.diff

numpy.diff(a, n=1, axis=-1)

Функция diff() возвращает n-ю разность элементов массива, которая так же может быть вычислена вдоль указанной оси (осям).

Первая разность вычисляется по формуле res[n] = a[n] - a[n-1] вдоль указанной оси массива. Следующие разности вычисляются рекурсивно.

Параметры:
a - подобный массиву объект или массив NumPy
Указанный объект или массив может состоять из любого доступного в NumPy числового типа, а также типа datetime64.
n - целое число (необязательный аргумент)
Указывает количество производимых вычитаний. Если n = 0 то входной массив возвращается без изменений.
axis - целое число (необязательный аргумент)
Ось по которой вычисляется разность. По умолчанию axis = -1, что соответствует последней оси массива.
Возвращает:
результат - массив NumPy
Массив с n-ой дискретной разностью элементов исходного массива. Количество осей массива сохраняется, но длинна указанной в параметре axis оси короче исходной на n. В большинстве случаев тип данных результата совпадает с типом входного массива, за исключением datetime64, который преобразуется в timedelta64.
Смотрите так же: ediff1d, gradient, cumsum

Замечание

При использовании беззнаковых целых чисел может быть получен неверный результат:

>>> x = np.array([1, 2, 3, 2], dtype = np.uint16)
>>> np.diff(x)
array([    1,     1, 65535], dtype=uint16)
>>> 
>>> x[3] - x[2]
__main__:1: RuntimeWarning: overflow encountered in ushort_scalars
65535

Что бы избежать подобных ошибок, тип данных должен быть приведен к более общему целочисленному типу данных:

>>> x.dtype = np.int16
>>> x
array([1, 2, 3, 2], dtype=int16)
>>> 
>>> np.diff(x)
array([ 1,  1, -1], dtype=int16)

Примеры

>>> import numpy as np
>>> 
>>> np.diff([])
array([], dtype=float64)
>>> np.diff([1])
array([], dtype=int32)
>>> 
>>> 
>>> x = np.array([1, 2, 3, 4, 5])
>>> np.diff(x)
array([1, 1, 1, 1])
>>> 
>>> np.diff(x, n = 2)
array([0, 0, 0])
>>> 
>>>
>>> x = x[::-1]
>>> x
array([5, 4, 3, 2, 1])
>>> 
>>> np.diff(x)
array([-1, -1, -1, -1])
>>> np.diff(x, n = 2)
array([0, 0, 0])
>>> 
>>> #  Числа могут быть любого доступного в NumPy типа:
... np.diff([1.9, 2.4, 3.1, 4.5])
array([0.5, 0.7, 1.4])
>>> 
>>> np.diff([1 + 1j, 4 + 3j, 2 + 8j])
array([ 3.+2.j, -2.+5.j])
>>>
>>>
>>> x = 2**x
>>> x
array([32, 16,  8,  4,  2], dtype=int32)
>>> np.diff(x)
array([-16,  -8,  -4,  -2], dtype=int32)
>>> np.diff(x, n = 2)
array([8, 4, 2], dtype=int32)
>>> np.diff(x, n = 3)
array([-4, -2], dtype=int32)
>>> 
>>> 
>>> x = np.arange(1, 17, 2).reshape(2, 4)
>>> x
array([[ 1,  3,  5,  7],
       [ 9, 11, 13, 15]])
>>> 
>>> #  По умолчанию разность вычисляется по
... #  последней оси:
... np.diff(x)    #  разность по строкам
array([[2, 2, 2],
       [2, 2, 2]])
>>> 
>>> np.diff(x, axis = 0)    #  разность по столбцам
array([[8, 8, 8, 8]])
>>> 
>>> 
>>> x = np.arange(1, 17, 2).reshape(2, 2, 2)
>>> x
array([[[ 1,  3],
        [ 5,  7]],

       [[ 9, 11],
        [13, 15]]])
>>> 
>>> np.diff(x, axis = 0)
array([[[8, 8],
        [8, 8]]])
>>> 
>>> np.diff(x, axis = 1)
array([[[4, 4]],

       [[4, 4]]])
>>> 
>>> np.diff(x, axis = 2)
array([[[2],
        [2]],

       [[2],
        [2]]])
>>>
>>>
>>> #  Данная функция может работать с датой и временем,
... #  позволяя вычислять длинну временных интервалов:
... x = np.array(['1989-01-20', '2018-08-29'], dtype=np.datetime64)
>>> np.diff(x)
array([10813], dtype='timedelta64[D]')
>>> 
>>> x = np.arange('2018-01-10', '2018-01-15', dtype=np.datetime64)
>>> x
array(['2018-01-10', '2018-01-11', '2018-01-12', '2018-01-13',
       '2018-01-14'], dtype='datetime64[D]')
>>> np.diff(x)
array([1, 1, 1, 1], dtype='timedelta64[D]')