python - python 中是否有类似于 `numpy.cumsum` 或 `numpy.cumprod` 的函数,如`cumreduce`?
问题描述
当我需要列表中元素的总和或乘积时,例如
>>> foo = [10, 5, 3, 4]
我可以使用numpy的sum
or函数prod
>>> import numpy as np
>>> np.sum(foo)
22
>>> np.prod(foo)
600
同样,当我需要累积总和或乘积时,我可以使用np.cumsum
或np.cumprod
>>> np.cumsum(foo)
array([10, 15, 18, 22])
>>> np.cumprod(foo)
array([ 10, 50, 150, 600])
有没有办法获得任意reduce
操作的累积结果?
例如,如果我有一个像
def my_fn(a, b):
return a + b**2
我可以functools.reduce
用来获得
>>> from functools import reduce
>>> reduce(my_fn, foo)
60
我正在寻找的是一个功能,它会给我以下
>>> cumreduce(my_fn, foo)
[10, 35, 44, 60]
也就是说,结果的每个元素都等于reduce(my_fn, foo[:i])
。
当然,我可以以天真的方式做到这一点
>>> def cumreduce(fn, seq):
... return [reduce(fn, seq[:i]) for i in range(1, len(seq)+1)]
>>> cumreduce(my_fn, foo)
[10, 35, 44, 60]
理想情况下,我正在寻找具有相同或相似功能的内置函数。
解决方案
在 Python 中,您正在寻找的是itertools.accumulate
:
import itertools
[*itertools.accumulate(foo,my_fn)]
# [10, 35, 44, 60]
Numpy ufuncs 通常有一个累积方法。例子:
np.bitwise_xor.accumulate(foo)
array([10, 15, 12, 8])
np.add.accumulate(foo)
array([10, 15, 18, 22])
# cf. cumsum:
np.cumsum(foo)
array([10, 15, 18, 22]
推荐阅读
- sql - 找到每个球员最长的连续得分
- php - 无法将时间戳插入 MySQL 数据库
- reactjs - 通过历史状态恢复特定页面的滚动位置
- dictionary - Mapbox Bright 不会渲染:我是否遗漏了命令?
- java - 无法在远程分区中执行并行执行
- c# - 使用带有 RedirectToAction 的区域会导致无限循环的重定向
- reactjs - React Hooks:重新渲染时的 setState 功能
- javascript - 如何捕获链接触发器以便传递参数?
- r - 如何在 paste0 结果的开头或结尾添加字符?
- python - 关于 python 3 在十六进制字符串转换中的问题