python – 有条件的numpy累积和

python – 有条件的numpy累积和,第1张

概述我正在寻找一种用numpy计算累积和的方法,但是如果累积和非常接近零且为负,则不想前滚该值(或将其设置为零). 例如 a = np.asarray([0, 4999, -5000, 1000])np.cumsum(a) 返回[0,4999,-1,999] 但是,我想在计算过程中将[2] – 值(-1)设置为零.问题是这个决定只能在计算过程中完成,因为中间结果不是先验的. 预期的数组是:[0,49 我正在寻找一种用numpy计算累积和的方法,但是如果累积和非常接近零且为负,则不想前滚该值(或将其设置为零).

例如

a = np.asarray([0,4999,-5000,1000])np.cumsum(a)

返回[0,-1,999]

但是,我想在计算过程中将[2] – 值(-1)设置为零.问题是这个决定只能在计算过程中完成,因为中间结果不是先验的.

预期的数组是:[0,1000]

这样做的原因是我得到的值非常小(浮点数,而不是示例中的整数),这是由浮点计算引起的,实际上应该为零.计算累积和会使那些导致错误的值复杂化.

解决方法 Kahan summation algorithm可以解决问题.不幸的是,它是 not implemented in numpy.这意味着需要自定义实现:

def kahan_cumsum(x):    x = np.asarray(x)    cumulator = np.zeros_like(x)    compensation = 0.0    cumulator[0] = x[0]        for i in range(1,len(x)):        y = x[i] - compensation        t = cumulator[i - 1] + y        compensation = (t - cumulator[i - 1]) - y        cumulator[i] = t    return cumulator

我不得不承认,这并不是问题所要求的. (在示例中,cumsum的第3个输出处的值为-1是正确的).但是,我希望这能解决问题背后的实际问题,这与浮点精度有关.

总结

以上是内存溢出为你收集整理的python – 有条件的numpy累积和全部内容,希望文章能够帮你解决python – 有条件的numpy累积和所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存