我有一个多数组的数据堆栈,这些数据被屏蔽以排除“不良”或有问题的值-这是第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本质上是所有被掩盖的值,或者我无法为其提供一种模式。
印刷面具很明显就是问题所在。我只是不知道如何解决它,或者为什么它会以这种方式运行。
谢谢。
答案 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
确实不够好。据我所知,它沿连续轴使用成对求和,在实践中往往是相当不错的。