在两台计算机上计算相同numpy的不同结果

时间:2012-11-16 17:05:15

标签: numpy python-2.7

我在win32上有两台带有python 2.7.2(MSC v.1500 32位(Intel)]和numpy 1.6.1的计算机。 但是

numpy.mean(data)

返回

1.13595094681 on my old computer 

1.13595104218 on my new computer

,其中

Data = [ 0.20227873 -0.02738848  0.59413314  0.88547146  1.26513398  1.21090782
1.62445402  1.80423951  1.58545554  1.26801944  1.22551131  1.16882968
1.19972098  1.41940248  1.75620842  1.28139281  0.91190684  0.83705413
1.19861531  1.30767155]

在这两种情况下

s=0
for n in data[:20]:
  s+=n
print s/20

给出

1.1359509334

任何人都可以解释为什么以及如何避免?

的Mads

2 个答案:

答案 0 :(得分:2)

如果你想避免两者之间的任何差异,那么明确地使它们成为32位或64位浮点数组。 NumPy使用其他几个可能是32位或64位的库。请注意,也可以在打印语句中进行舍入:

>>> import numpy as np
>>> a = [0.20227873, -0.02738848,  0.59413314,  0.88547146,  1.26513398,
         1.21090782, 1.62445402,  1.80423951,  1.58545554,  1.26801944,
         1.22551131,  1.16882968, 1.19972098,  1.41940248,  1.75620842,
         1.28139281,  0.91190684,  0.83705413, 1.19861531,  1.30767155]
>>> x32 = np.array(a, np.float32)
>>> x64 = np.array(a, np.float64)
>>> x32.mean()
1.135951042175293
>>> x64.mean()
1.1359509335
>>> print x32.mean()
1.13595104218
>>> print x64.mean()
1.1359509335

另一点需要注意的是,如果您有多线程的低级库(例如,atlas,lapack),那么对于大型数组,由于可能的操作顺序和顺序,您的结果可能会有差异。浮点精度。

此外,您处于32位数字的精度极限:

>>> x32.sum()
22.719021
>>> np.array(sorted(x32)).sum()
22.719019

答案 1 :(得分:0)

这种情况正在发生,因为您有Float32个数组(单精度)。使用单精度,操作仅精确到小数点后6位。因此,您的结果是相同的,直到小数点后6位(小数点后,舍入最后一位数),但在此之后它们不准确。之后,不同的架构/机器/编译器将产生不同的结果。如果你想要相同的结果,你应该使用更高精度的数组(例如Float64)。