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.
Замечание
При использовании беззнаковых целых чисел может быть получен неверный результат:
>>> 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]')