我有一些具有较小值的多维numpy.array
s
我需要加上很少的数值误差。对于float
,有math.fsum
(及其实施here),这对我来说一直很好。 numpy.sum
不够稳定。
如何获得numpy.array
s的稳定总结?
背景
这是the quadpy package。小值的数组是在(许多)间隔的特定点处的函数的评估,乘以它们的权重。这些的总和是所述函数在区间上的积分的近似值。
答案 0 :(得分:3)
好吧,我已经实现了accupy,它提供了一些稳定的求和算法。
对于numpy数组,这是Kahan summation的快速而又脏的实现。但是请注意,对于病态的总和而言,它并不是非常准确。
def kahan_sum(a, axis=0):
'''Kahan summation of the numpy array along an axis.
'''
s = numpy.zeros(a.shape[:axis] + a.shape[axis+1:])
c = numpy.zeros(s.shape)
for i in range(a.shape[axis]):
# https://stackoverflow.com/a/42817610/353337
y = a[(slice(None),) * axis + (i,)] - c
t = s + y
c = (t - s) - y
s = t.copy()
return s
它完成了这项工作,但它很慢,因为它是在axis
维度上进行Python循环。