无需pd.Series,如何在NumPy中高效实现移位与滚动求和?
纯NumPy高效实现方案
核心思路
利用前缀和实现滑动窗口求和,时间复杂度O(n),完全规避Pandas对象的封装开销,适合大规模数组的高效处理。
实现代码
import numpy as np sumvalues = 2 touchdown = 3 arr = np.array([1, 2, 3, 4, 5, 6, 7]) # 1. 构造扩展数组:原数组末尾补touchdown个0 ext_arr = np.concatenate([arr, np.zeros(touchdown, dtype=arr.dtype)]) # 2. 计算前缀和数组 prefix = np.cumsum(ext_arr) # 3. 计算滑动窗口求和,处理窗口长度不足sumvalues的边界情况 window_sums = np.empty_like(ext_arr, dtype=np.float64) # 前sumvalues个元素,直接取前缀和(窗口从数组开头到当前位置) window_sums[:sumvalues] = prefix[:sumvalues] # 从第sumvalues个元素开始,用前缀和差值得到完整窗口的和 window_sums[sumvalues:] = prefix[sumvalues:] - prefix[:-sumvalues] # 4. 截取从touchdown索引开始的部分,得到最终结果 result = window_sums[touchdown:] print(result)
输出验证
运行代码后输出与原Pandas实现完全一致:
[ 7. 9. 11. 13. 7. 0. 0.]
效率说明
- 前缀和计算是NumPy内置的高度优化操作,相比Pandas的
rolling方法,省去了Series对象的额外开销。 - 针对百万级以上的超大数组,该方法的运行速度会比原Pandas实现快数倍甚至一个数量级。
内容的提问来源于stack exchange,提问作者spline regressor
相关产品推荐
相关产品推荐

