numpy的diff函数默认计算沿axis=0的一阶前向差分,即后项减前项,结果长度减1;它只返回差值,不计算变化率,需手动除以时间步长或前项值等。

NumPy的diff函数默认计算什么?
diff 默认对数组沿 axis=0(即第一维)做一阶前向差分:每个元素等于后一个减前一个,结果长度比原数组少 1。它不直接算“变化率”,只返回差值。比如 np.diff([2, 5, 9]) 返回 [3, 4],不是 [1.5, 0.8] 这类比值。
常见误用是以为 diff 能自动除以时间步长或基准值——它不会。要得到变化率(如百分比变化、单位时间变化量),必须手动除。
- 对等间隔采样数据(如每秒一个点),需额外除以时间步长
dt:np.diff(arr) / dt - 对相对变化率(如增长率),需除以前一项:
np.diff(arr) / arr[:-1],注意arr[:-1]长度匹配 - 若
arr含零或接近零值,arr[:-1]中出现 0 会导致inf或nan,得提前处理
如何用diff计算时间序列的单位时间变化率?
前提是时间轴等距。例如传感器每 0.1 秒采样一次,数组 temp 存温度值,则温度变化率(°C/s)为:
import numpy as np temp = np.array([20.0, 20.3, 20.9, 21.2]) dt = 0.1 # 秒 rate = np.diff(temp) / dt # → [3.0, 6.0, 3.0] °C/s
如果时间不等距(如时间戳存于 t 数组),不能直接用标量 dt,得先算时间差:
- 用
np.diff(t)得到各段时长 - 再逐元素除:
np.diff(temp) / np.diff(t) - 确保
t和temp等长,且t单调递增,否则差分会出负除数
为什么np.diff(arr, n=2)有时结果全是零?
这是高阶差分的典型陷阱。n=2 表示对一阶差分结果再做一次差分,相当于离散二阶导数近似。如果原始数据本身是线性趋势(如 [1, 3, 5, 7]),一阶差分为常数 [2, 2, 2],二阶差分就全为 0。
实际中容易误判为“函数没生效”或“数据异常”,其实只是数据平滑或模型过于简单所致。
- 检查原始数据是否近似线性:画图看趋势,或用
np.polyfit拟合一次多项式 - 非线性信号(如正弦波、指数衰减)才可能在二阶差分中保留结构
-
n > 1会进一步缩短输出长度:输入长度L,n阶差分输出长度为L - n
用diff算百分比变化时要注意什么?
最常用写法是 np.diff(x) / x[:-1] * 100,但有三个硬伤:
-
x[:-1]若含 0,除法报RuntimeWarning,结果含inf;建议加掩码:denom = np.where(x[:-1] == 0, np.nan, x[:-1]) - 若
x是整型数组(如int64),np.diff(x) / x[:-1]在 Python 3 中默认转为浮点,但某些旧 NumPy 版本可能截断,显式转x.astype(float)更稳 - 金融场景常用“对数收益率”代替简单百分比:用
np.diff(np.log(x)),它对小变动更鲁棒,且具备可加性
差分本身很简单,难的是明确你到底要“差”什么、“率”相对于谁、以及分母有没有隐含假设。多数 bug 不出在 diff 调用上,而出在后续除法的维度对齐和边界值处理里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











