numpy.sum过渡到kahan,但使用掩码数组以提高精度

时间:2019-07-03 20:15:41

标签: python arrays numpy

我有一个多数组的数据堆栈,这些数据被屏蔽以排除“不良”或有问题的值-这是第3维的。当前代码使用np.sum,但是精度级别(无论大小)都对结果产生负面影响。我尝试实现此处引用的kahan_sum,但是忘记了被屏蔽的数组,并且结果不相似(由于屏蔽)。我希望通过利用kahan求和和累加器来增加精度保持,将使下游操作保持较少的错误。

来源/研究: https://github.com/numpy/numpy/issues/8786 Kahan summation Python floating point precision sum(我已尽可能提高精度,但这无济于事)


import numpy as np
import numpy.ma as ma


def kahan_sum(a, axis=None):
    s = numpy.zeros(a.shape[:axis] + a.shape[axis+1:])
    c = numpy.zeros(s.shape)
    for i in range(a.shape[axis]):
        # http://stackoverflow.com/a/42817610/353337
        y = a[(slice(None),) * axis + (i,)] - c
        t = s + y
        c = (t - s) - y
        s = t.copy()
    return s


data=np.random.rand(5,5,5)
dd=np.ma.masked_array(data=d, mask=np.random.rand(5,5,5)<0.2)

我想沿第3个轴(轴= 2)求和,因为这实际上是我的照片“叠”。

口罩没有按我预期的那样出来。可能我太劳累了...

np.sum(dd, axis=2)
kahan_sum(dd, axis=2)

np.sum提供了一个完全填充的数据数组,并且排除了“掩码”值。 kahan_sum本质上是所有被掩盖的值,或者我无法为其提供一种模式。

印刷面具很明显就是问题所在。我只是不知道如何解决它,或者为什么它会以这种方式运行。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您确实需要更高的精度,请考虑使用精确到fp分辨率的math.fsum。如果A是3D蒙版数组,则类似:

i,j,k = A.shape
np.frompyfunc(lambda i,j:math.fsum(A[i,j].compressed().tolist()),2,1)(*np.ogrid[:i,:j])

但在此之前,我会三遍核实np.sum确实不够好。据我所知,它沿连续轴使用成对求和,在实践中往往是相当不错的。