使用np.cumprod向量化Python累乘函数结果错误如何解决?
问题原因分析
- 核心错误是错误使用了
sum()方法,且对np.cumprod的返回值理解有误:- 原始循环逻辑是计算指定区间所有元素的总乘积:从
mt[age]开始,依次乘以mt[age+1]到mt[age2-1]的所有元素,最终返回单个乘积结果 np.cumprod()返回的是累积乘积数组:你测试用例中传入的mt[age+1:age2]是长度为3的数组[0.999709, 0.99973, 0.999743],np.cumprod的输出是[0.999709, 0.999709*0.99973, 0.999709*0.99973*0.999743]三个元素的数组- 额外加的
sum()把这三个累积乘积值加总了,得到的是求和结果而非你需要的总乘积,自然和正确值不符
- 原始循环逻辑是计算指定区间所有元素的总乘积:从
修正方案
两种正确的向量化写法:
方案1:保留np.cumprod,取最后一个元素
def getnpxtocertv(mt, age, age2): # 累积乘积的最后一个元素就是区间总乘积 return mt[age] * np.cumprod(mt[age+1:age2])[-1]
方案2:直接用np.prod计算总乘积,逻辑更直观
def getnpxtocertv(mt, age, age2): # 直接计算[age, age2)区间所有元素的总乘积 return np.prod(mt[age:age2])
验证
调用修正后的函数传入你的测试参数,返回结果为0.9991822227268075,和原始循环的输出完全一致。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

