Нашли ошибку?
среднийNumPy 2.5.3

Разности: diff и gradient

Изменение между соседними элементами — расход по показаниям счётчика, прирост по дням, скорость по координатам.

Нужно знать:Оси: axis и keepdims

Содержание статьи

Коротко

  • np.diff(a) — a[1:] - a[:-1]: разности соседних элементов. Результат на 1 короче.
  • prepend= / append= добавляют значение перед вычислением, чтобы сохранить длину.
  • n=2 — разность разностей (вторая разность).
  • В многомерном массиве по умолчанию берётся последняя ось; другая — через axis.
  • diff и cumsum взаимно обратны. np.gradient возвращает массив той же длины: центральные разности внутри и односторонние на краях.

Синтаксис

np.diff(a, n=1, axis=-1, prepend=None, append=None)
np.gradient(a)          # производная по сетке с шагом 1
np.gradient(a, x)       # по координатам x

Параметры

ПараметрЧто делаетПо умолчанию
nсколько раз взять разность1
axisось, вдоль которой считать-1
prepend, appendзначения, которые добавляются в начало / конец перед вычислениемNone

Примеры

Данные для примеровиспользуются во всех примерах ниже
meter = np.array([1200, 1215, 1233, 1240, 1262])   # показания счётчика по дням
Расход по дням
np.diff(meter)                    # расход за каждый день: на 1 элемент короче
Вывод
array([15, 18,  7, 22])
Сохранить длину
np.diff(meter, prepend=meter[0])  # та же длина: первый день — 0
Вывод
array([ 0, 15, 18,  7, 22])
cumsum отменяет diff
usage = np.diff(meter)
meter[0] + np.concatenate([[0], np.cumsum(usage)])   # cumsum восстанавливает показания
Вывод
array([1200, 1215, 1233, 1240, 1262])
Вторая разность
np.diff(meter, n=2)               # изменение расхода
Вывод
array([  3, -11,  15])
Двумерный массив
table = np.array([[1, 4, 9],
                  [2, 3, 7]])
print(np.diff(table))             # по умолчанию — вдоль последней оси (строк)
np.diff(table, axis=0)            # между строками
Вывод
[[3 5]
 [1 4]]
array([[ 1, -1, -2]])
gradient — производная той же длины
np.gradient(np.array([1.0, 4.0, 9.0, 16.0]))   # центральные разности, длина та же
Вывод
array([3., 4., 6., 7.])

Подводные камни

Беззнаковые целые

Для uint8, uint16 и других беззнаковых типов отрицательная разность «переворачивается» в большое положительное число. Перед diff переведите массив в знаковый тип: level.astype(np.int16).

diff для uint8
level = np.array([5, 3, 8], dtype=np.uint8)
np.diff(level)                    # 3 − 5 в беззнаковом типе даёт 254
Вывод
array([254,   5], dtype=uint8)