Коротко
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сколько раз взять разность1axisось, вдоль которой считать-1prepend, 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])
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]])
np.gradient(np.array([1.0, 4.0, 9.0, 16.0])) # центральные разности, длина та жеВывод
array([3., 4., 6., 7.])
Подводные камни
Беззнаковые целые
Для uint8, uint16 и других беззнаковых типов отрицательная разность «переворачивается» в большое положительное число. Перед diff переведите массив в знаковый тип: level.astype(np.int16).
level = np.array([5, 3, 8], dtype=np.uint8)
np.diff(level) # 3 − 5 в беззнаковом типе даёт 254Вывод
array([254, 5], dtype=uint8)