如何生成步长递增的numpy.arange数组?
高效生成可变步长的实时时间数组(基于Numpy)
核心解法:利用numpy.cumsum()实现向量化累加
你要的功能完全可以通过Numpy的**累加函数cumsum()**高效实现,这比Python循环快几个数量级,尤其适合处理大数组。
原理很简单:你的递归公式t(i) = t(i-1) + dt(i)本质上就是初始值加上所有前序增量的累加和。步骤如下:
- 先生成所有相邻索引间的增量数组
dt - 对
dt做累加,再加上初始时间值,就能得到完整的实时时间数组
对应你的示例实现
你的示例中,增量dt(i) = 2i(i从1到6),初始时间t(0)=0,代码如下:
import numpy as np # 生成索引对应的增量数组(i从1到6) dt = 2 * np.arange(1, 7) # 生成时间数组:初始值0 + 增量的累加 t = np.concatenate([[0], np.cumsum(dt)]) print(t) # 输出:[ 0 1 5 11 19 29 41]
完全匹配你给出的示例结果。
通用线性增量场景的实现
如果你的增量是通用线性函数dt(i) = m*i + b,同样可以用这个思路:
import numpy as np m = 2 # 斜率 b = 0 # 截距 n = 7 # 时间数组的长度(对应索引0到6) t0 = 0 # 初始时间 # 生成i从1到n-1的增量数组 dt = m * np.arange(1, n) + b # 生成时间数组 t = np.insert(np.cumsum(dt), 0, t0)
为什么不用循环?
Python的for循环在处理十万/百万级别的大数组时,会因为逐元素操作的开销变得很慢。而cumsum()是Numpy底层用C实现的向量化操作,能充分利用CPU的并行计算能力,速度差距非常明显。
内容的提问来源于stack exchange,提问作者Lepakk
相关产品推荐
相关产品推荐

