python - 对类似列表的对象进行乘积和求和的简单矢量化

标签 python pandas numpy vectorization

我想做一个看似简单的操作,也许我只是被阻止了,但是执行此计算的最快方法是什么?

mret = 0
for i in range(1, len(monthly_rets)):
    mret += monthly_rets[i:].prod()

monthly_rets 是一个长度为 2-540 的 np.array(即它的长度可以在 2 到 540 之间变化,它不一定是一个 np.array),每月因子返回(对于问题)。一定有一些聪明的技巧可以用来避免使用 for 循环并加快速度吗?

最佳答案

您可以使用 np.cumprod 的组合和 np.sum 。像这样的东西应该可以工作(至少对于 numpy 数组):

mret = monthly_rets[:0:-1].cumprod().sum()

np.cumprod计算数组的累积乘积,这意味着如果您有一个数组 a具有三个元素 a[0] , a[1] ,和a[2] a.cumprod()会给你数组 [a[0], a[0]*a[1], a[0]*a[1]*a[2]] 。现在你想要拥有类似的东西。这是通过使用切片 [:0:-1] 来完成的,它将向后遍历数组,以倒数第二个元素结束,这样 a[:0:-1].cumprod()会给你[a[2], a[1]*a[2]]sum()然后将总结所有元素以得出结果。 (感谢 @B.M. 指出正确的切片。)

顺便说一句,我使用 ipython 检查了 540 个随机数数组(对应于最大的数组)的性能优势。的%timeit 。我得到的加速为 2.3ms/10μs=230。甚至计算 %timeit 的缓存效果警告(可能是错误的)你肯定有至少 40 的加速。

关于python - 对类似列表的对象进行乘积和求和的简单矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41983818/

相关文章:

python - 使用 iloc 进行 Pandas 复制无法按预期工作

python - 结果稀疏性已知时的稀疏矩阵乘法(在 python|scipy|cython 中)

python - 用 NumPy 向量化 groupby

python - 使用 numpy 进行网格分布

python - CNN、GAN,生成器如何知道它应该绘制哪个类?

python - 从 Pandas 多重索引中删除列

python - 恢复 Pandas 中的默认显示上下文

python - RollingGroupby 上的 Pandas 聚合方法

python - 解析登陆页面的链接时无法提高性能

python - 尝试从 html 表 python 添加某个值作为键并为该键添加多个值