fsum为numpy.arrays,稳定求和

时间:2017-03-15 17:26:00

标签: python arrays numpy

我有一些具有较小值的多维numpy.array s 我需要加上很少的数值误差。对于float,有math.fsum(及其实施here),这对我来说一直很好。 numpy.sum不够稳定。

如何获得numpy.array s的稳定总结?

背景

这是the quadpy package。小值的数组是在(许多)间隔的特定点处的函数的评估,乘以它们的权重。这些的总和是所述函数在区间上的积分的近似值。

1 个答案:

答案 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循环。