我在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
答案 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
)。