Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy.sum转换到kahan,但使用遮罩阵列以提高精度_Python_Arrays_Numpy - Fatal编程技术网

Python numpy.sum转换到kahan,但使用遮罩阵列以提高精度

Python numpy.sum转换到kahan,但使用遮罩阵列以提高精度,python,arrays,numpy,Python,Arrays,Numpy,我有一个多数组的数据堆栈,它被屏蔽以排除“坏”或有问题的值-这是在第三维中。当前代码使用np.sum,但精度级别(大数字和小数字)对结果有负面影响。我尝试实现这里引用的kahan_和,但忘记了屏蔽数组,结果不相似(由于屏蔽)。我希望通过使用kahan求和和累加器增加的精度保留将允许下游操作保持较少的误差 资料来源/研究: (我已经尽可能地提高了精度,但没有帮助) 将numpy作为np导入 将numpy.ma导入为ma def kahan_总和(a,轴=无): s=numpy.zero(a.sh

我有一个多数组的数据堆栈,它被屏蔽以排除“坏”或有问题的值-这是在第三维中。当前代码使用np.sum,但精度级别(大数字和小数字)对结果有负面影响。我尝试实现这里引用的kahan_和,但忘记了屏蔽数组,结果不相似(由于屏蔽)。我希望通过使用kahan求和和累加器增加的精度保留将允许下游操作保持较少的误差

资料来源/研究: (我已经尽可能地提高了精度,但没有帮助)


将numpy作为np导入
将numpy.ma导入为ma
def kahan_总和(a,轴=无):
s=numpy.zero(a.shape[:axis]+a.shape[axis+1:])
c=整数零(s形)
对于范围内的i(a.形状[轴]):
# http://stackoverflow.com/a/42817610/353337
y=a[(切片(无),)*轴+(i,)]-c
t=s+y
c=(t-s)-y
s=t.copy()
返回s
数据=np.random.rand(5,5,5)

DD=NP .mas.MaskdId数组(Data=D,Mask= NP.No.Rand(5,5,5)

如果你真的需要更多的精度,考虑使用<代码> Mault.FSUM 这对FP分辨率是准确的。如果<代码> 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
是否真的不够好。据我所知,它使用沿连续轴的两两求和,这在实践中往往是非常好的。

不幸的是,它是np.sum,只是不起作用。我的意思是,它有几亿个单独的数据集,但它仍然是关闭的,我开始使用它mp对抗边缘案例。如果内联有效,我会欣喜若狂。我在任何地方都没有看到任何改进精度讨论的那种类型的响应。编辑:因为我试图创建一个插入式替换,下面的建议没有起作用。目前我得到的是浮点除以零(某处)在我庞大的数据集中,所以我将进一步研究。我想我将不得不放弃获得更好的精度,因为Numppy没有给我这样做的灵活性,而且我还没有足够的悟性来编写详尽的函数来处理它。任何其他想法都将是受欢迎的,我很感谢Paul,你的建议-给了我一个很好的st艺术
i,j,k = A.shape
np.frompyfunc(lambda i,j:math.fsum(A[i,j].compressed().tolist()),2,1)(*np.ogrid[:i,:j])