numpy.ediff1d

numpy.ediff1d(a, to_end=None, to_begin=None)

Функция ediff1d() возвращает разность между последовательными элементами массива. Если входной массив является многомерным, то он сжимается до одной оси (эквивалентна a.flat[1:] - a.flat[:-1]).

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

Замечание

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

>>> x = np.array([1, 2, 3, 2], dtype = np.uint16)
>>> np.ediff1d(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.ediff1d(x)
array([ 1,  1, -1], dtype=int16)

Примеры

>>> import numpy as np
>>> 
>>> np.ediff1d([])
array([], dtype=float64)
>>> np.ediff1d([1])
array([], dtype=int32)
>>> 
>>> 
>>> x = np.array([1, 2, 3, 4, 5])
>>> np.ediff1d(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.ediff1d([1.9, 2.4, 3.1, 4.5])
array([0.5, 0.7, 1.4])
>>> 
>>> np.ediff1d([1 + 1j, 4 + 3j, 2 + 8j])
array([ 3.+2.j, -2.+5.j])
>>>
>>>
>>> #  Многомерные массивы предварительно сжимаются до одной оси:
... x = np.arange(1, 13, 2).reshape(2, 3)
>>> x
array([[ 1,  3,  5],
       [ 7,  9, 11]])
>>> 
>>> np.ediff1d(x)
array([2, 2, 2, 2, 2])
>>>
>>>
>>> x = [2, 3, 5, 7]
>>> start = 0
>>> finish = 99
>>> 
>>> np.ediff1d(x, to_begin = start, to_end = finish)
array([ 0,  1,  2,  2, 99])
>>> 
>>> start = [-2, -1]
>>> finish = [77, 99]
>>> np.ediff1d(x, to_begin = start, to_end = finish)
array([-2, -1,  1,  2,  2, 77, 99])
>>> 
>>> start = [[-2], [-1]]
>>> finish = [[77], [99]]
>>> np.ediff1d(x, to_begin = start, to_end = finish)
array([-2, -1,  1,  2,  2, 77, 99])
>>>
>>>
>>> #  Данная функция может работать с датой и временем,
... #  позволяя вычислять длинну временных интервалов:
... x = np.array(['1989-01-20', '2018-08-29'], dtype=np.datetime64)
>>> np.ediff1d(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.ediff1d(x)
array([1, 1, 1, 1], dtype='timedelta64[D]')