【发布时间】:2021-12-05 13:08:36
【问题描述】:
我得到了二维数组 A 和 B。它们是相同的,但是通过两种不同的方法获得。考虑以下几行:
In [1]: (A==B).all()
Out [1]: True
In [2]: A.shape
Out [2]: (500, 10805)
In [3]: B.shape
Out [3]: (500, 10805)
In [4]: numpy.mean(A,axis=1)[0]
Out [4]: -0.006108739586784807
In [5]: numpy.mean(A[0,:])
Out [5]: -0.006108739586784786
In [6]: numpy.mean(B,axis=1)[0]
Out [6]: -0.006108739586784786
In [7]: numpy.mean(B[0,:])
Out [7]: -0.006108739586784786
如您所见,第 [4] 行的结果与第 [5]、[6] 和 [7] 行的结果不同,但它们应该相同。这是什么原因?
numpy.sum() 和 numpy.std() 也会出现同样的问题。
【问题讨论】:
-
可能是浮动算术精度
-
最有可能 numpy.mean 执行多线程操作 (OpenMP) 并且归约操作不是确定性的。在浮动操作中,A+B+C 不一定严格等于 A+C+B。如果您认为这是一个问题,您可以在启动您的 python 代码之前尝试将 KMP_DETERMINISTIC_REDUCTION=TRUE 设置为全局环境变量。
-
输出是否具有确定性,即重新执行第 4 行是否总是得到相同“错误”结果?
-
@DaniMesejo 你可能是对的。但是 A 和 B 怎么可能相等但不会产生相同的“错误”结果呢?即 numpy.mean(A,axis=1)[0] != numpy.mean(B,axis=1)[0]