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