np.cumsum和np.cumprod用于向量化累加/累乘,返回同形状累积数组而非标量;一维从左到右,二维默认axis=0(列向),axis=1为行向;需防NaN传播、dtype溢出及精度损失。

用 np.cumsum 和 np.cumprod 做向量化累加/累乘
NumPy 里不需要写循环,np.cumsum 和 np.cumprod 就是专干这事的。它们默认按第一个轴(axis=0)计算,对一维数组就是从左到右累加/累乘,返回同长度结果数组。
常见错误是误以为它们会自动降维或改变 shape —— 实际上输出和输入维度一致,只是每个位置存的是截至该位置的累积值。
- 一维数组直接传入:
np.cumsum([1, 2, 3, 4])→array([1, 3, 6, 10]) - 二维数组要小心 axis:默认
axis=0是列方向累加;想按行算得显式写axis=1 - 注意数据类型溢出:比如 uint8 数组做
cumprod很快就 wrap around,建议提前转成int64或float64
axis 参数怎么选:列累加 vs 行累加
二维数组下,axis 决定“沿着哪个方向滚着算”。axis=0 表示跨行(即每列独立累加),axis=1 表示跨列(即每行独立累加)。这个和 sum、mean 的 axis 含义一致,但新手常反着记。
arr = np.array([[1, 2], [3, 4]])-
np.cumsum(arr, axis=0)→[[1, 2], [4, 6]](第一列:1→1+3;第二列:2→2+4) -
np.cumsum(arr, axis=1)→[[1, 3], [3, 7]](第一行:1→1+2;第二行:3→3+4) - axis=-1 等价于最后一维,对二维就是 axis=1;axis=None 会先 flatten 再算,结果是一维
处理 NaN:用 nan 版本函数还是预处理?
np.cumsum 和 np.cumprod 遇到 np.nan 会直接污染整条路径:一旦出现 NaN,后面全变 NaN。没有内置 skipna 参数,这点和 pandas 不同。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- 如果必须跳过 NaN,得先用
np.where或布尔索引把 NaN 替换成 0(累加)或 1(累乘),但要注意语义是否合理 - 更稳妥的做法是:用
np.isnan()找出 NaN 位置,切片分段调用cumsum,再拼起来 —— 适合稀疏 NaN 场景 - 若数据来自 pandas,可考虑先用
df.fillna(0).to_numpy()转换,但需确认填充值不影响业务逻辑
性能关键点:inplace 没有,但可以复用 output 数组
这两个函数不支持 out= 参数的原地更新(不像 np.add 那样能指定 output buffer),但可以传入预先分配好的 out 数组来避免内存重复分配。
out_arr = np.empty_like(x, dtype=np.float64)-
np.cumsum(x, out=out_arr)—— 这样能省掉一次 malloc,批量处理大量小数组时有效 - 注意
out必须 shape 和 dtype 兼容,否则报ValueError: output array is not acceptable - 如果 x 是整型而你想要 float 累积结果,必须让
out是 float 类型,否则中间溢出可能静默发生
最易被忽略的是 dtype 隐式转换问题:输入是 int32,累加到超范围时不会自动升为 int64,而是截断。动手前先看 x.dtype,必要时用 x.astype(np.int64) 显式升级。

















