np.cumsum()和np.cumprod()返回累计数组而非标量,axis指定累计轴(非压缩轴),NaN会传播,需注意dtype溢出与精度问题。

用 np.cumsum() 和 np.cumprod() 计算一维数组的累计和与累计积
这两个函数默认沿 axis=0(即第一个维度)计算,对一维数组来说就是从左到右累加或累乘。结果数组形状与输入一致,长度相同,第 i 个元素是前 i+1 个元素的和或积。
常见错误是误以为返回单个标量值——它们返回的是完整数组,不是最终总和或总积。
-
np.cumsum([1, 2, 3, 4])→array([1, 3, 6, 10]) -
np.cumprod([2, 3, 4])→array([2, 6, 24]) - 若输入含
0或负数,cumprod结果会迅速趋近于 0 或符号翻转,需留意数值稳定性
多维数组中指定 axis 控制累计方向
二维数组默认按行累计(axis=0),即每列独立计算;设 axis=1 才按列累计(每行独立)。这个 axis 含义容易和 sum() 混淆——记住:cumsum 的 axis 指“累计发生的那个轴”,不是“被压缩的轴”。
例如 a = np.array([[1, 2], [3, 4]]):
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
-
np.cumsum(a, axis=0)→[[1, 2], [4, 6]](第一列:1→1+3;第二列:2→2+4) -
np.cumsum(a, axis=1)→[[1, 3], [3, 7]](每行内部累加) - 不传
axis参数时,数组先展平再计算,结果是一维数组,不是保持原 shape
处理 NaN 和 inf 值时的默认行为与替代方案
cumsum 和 cumprod 遇到 np.nan 会直接传播:一旦出现 NaN,后续所有值都变成 NaN。它们不自动跳过 NaN,也不提供类似 nanmean 的 skipna 参数。
-
np.cumsum([1, np.nan, 3])→[1., nan, nan] - 若需忽略 NaN 累计,得手动预处理:用
np.where(np.isnan(x), 0, x)替换(加法场景),或用布尔掩码提取非 NaN 元素再累计(但会改变索引对齐) -
np.inf在cumprod中极易导致上溢,尤其长数组中,建议提前检查极端值
性能与 dtype 注意点:避免 int 溢出和 float 精度损失
累计运算会放大原始类型限制。int32 数组做 cumsum 可能中途溢出(如大量小整数相加),而 float32 累计积易因舍入误差偏离真实值。
- 默认输出 dtype 与输入一致,不会自动升级;必要时显式指定
dtype=np.int64或dtype=np.float64 -
np.cumsum(arr, dtype=np.float64)比arr.astype(np.float64).cumsum()更省内存 - 对超大数组,累计操作本身是 O(n) 时间,但中间结果存储开销不可忽略——如果只关心最后结果,用
np.sum()或np.prod()更高效

















