什么是最有效的方法来总结ndarray numpy同时最小化浮点不准确?

Dav*_*olt 4 python precision numpy

我有一个大矩阵,其数值在数量级上变化很大.为了尽可能精确地计算总和,我的方法是将ndarray重新整形为一维数组,对其进行排序,然后将其添加起来,从最小的条目开始.有没有更好/更有效的方法来做到这一点?

Jai*_*ime 5

我认为,鉴于浮点精度问题,最常见的算法是Kahan求和.出于实际目的,Kahan求和具有与加数的数量无关的误差界限,而朴素求和具有与加数的数量线性增长的误差界限.

NumPy不使用Kahan求和,没有大的性能权衡,没有简单的方法来实现它.但是在一些合理的假设下,它使用了下一个最好的事情,即成对求和,其中误差增加,例如求和数的对数的平方根.

因此,Numpy很可能已经能够为您的问题提供足够高的精度.为了验证这一点,我实际上会通过Kahan求和运行一些示例案例(上面维基百科链接中的伪代码可以简单地转换为Python),并将其作为黄金,最佳结果,并将其与以下内容进行比较:

  1. np.sum按原样调用矩阵.
  2. np.sum重塑为1D后调用矩阵,如果矩阵在内存中不连续,可能会产生更好的结果.
  3. 调用np.sum1D阵列的排序版本.

对于大多数情况,这最后三个选项应该表现相似,但唯一知道的方法是实际测试它.