2017-03-15 12 views
1

我有一個多維numpy.array s的小數值 ,我需要合計一點數值錯誤。對於float s,有math.fsum(其實施here),這對我來說一直很好。 numpy.sum不夠穩定。fsum for numpy.arrays,穩定總和

如何才能獲得numpy.array s的穩定求和?


背景

這是the quadpy package。小數值的數組是對(許多)間隔的特定點處的函數的評估,乘以它們的權重。這些總和是所述函數在間隔上的積分的近似值。

+0

爲什麼'numpy.sum'或'your_array.sum()'適合您的需求? – ForceBru

+0

感謝您的回覆。 'numpy.sum'對我來說不夠穩定。我想這只是一個接一個地添加(小)值,所以最後,當添加大數和小數時,信息會丟失。 –

+2

我相信['numpy.sum'使用成對求和](https://github.com/numpy/numpy/pull/3685),所以它比一個天真的總和要好,但如果你正在尋找更多的東西, NumPy不提供它。如果您的NumPy先於成對的總和更改,則更新可能會有所幫助。 – user2357112

回答

0

好吧,這裏是Kahan summation爲numpy的陣列系統的實現:

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 

它的工作,但它是緩慢的,因爲它是Python的循環在axis個維度。