问题描述
import { FETCH_USER } from "../actions/types";
import { CHECKOUT_SESSION_CREATED } from "../actions/types";
const initialState = {
sessionId: null,};
export default function (state = initialState,action) {
switch (action.type) {
case FETCH_USER:
return action.payload || false;
case CHECKOUT_SESSION_CREATED:
state = {
...state,sessionId: action.payload,};
return state;
default:
return state;
}
}
正确返回: 数组([0.5,0.6,0.5,0.75,0.75])
我可以将其重写为列表推导式或其他更短的算法吗?
解决方法
您可以使用itertools.accumulate
:
from itertools import accumulate
def transform_cbdeltas_to_rates(mp,r):
dd = list(accumulate((m/100 for m in mp),initial=r))
return np.array(dd)
我很确定有一个 numpy
等价于积累东西(例如 numpy.ufunc.accumulate
),但我不是 numpy
专家。
Schwobaseggl 发布了一个完全可以接受的答案,所以我不会过多地扩展他们的答案。 numpy
的做事方式,确实更短而且速度更快:
def transform_cbdeltas_to_rates_numpy(mp,r):
return np.concatenate(([r],np.add.accumulate(mp/100)+r))
%timeit np.concatenate(([r],np.add.accumulate(mp/100)+r))
4.11 µs ± 58.7 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
%timeit dd = np.array(list(accumulate((m/100 for m in mp),initial=r)))
7.59 µs ± 189 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
,
这是 numpy
版本:
mp =np.array([10,-10,25,0.0])
def transform_cbdeltas_to_rates(mp,(np.cumsum(mp.copy()) * 0.01) + r))
transform_cbdeltas_to_rates(mp,.5)
编辑:感谢@Jacob Faib 指出错误。现在工作。