2016-04-15 33 views
1

我正在Python(Numpy)和R中进行数据分析。我的数据是一个向量795067 X 3,并计算此平均值,中值,标准偏差和IQR数据会产生不同的结果,具体取决于我使用的是Numpy还是R.我对这些值进行了交叉检查,看起来R给出了“正确”的值。浮点数的乘法在Numpy和R中给出了不同的结果

Median: 
Numpy:14.948499999999999 
R: 14.9632 

Mean: 
Numpy: 13.097945407088607 
R: 13.10936 

Standard Deviation: 
Numpy: 7.3927612774052083 
R: 7.390328 

IQR: 
Numpy:12.358700000000002 
R: 12.3468 

两个平台上的数据的最大值和最小值是相同的。我跑了一个快速测试,以更好地了解这里发生了什么。

  • 在Numpy中乘以1.2 * 1.2得到1.4(与R相同)。
  • 乘以1.22 * 1.22在Numpy中给出了1.4884并且与R相同。
  • 然而,在Numpy中乘以1.222 * 1.222给出了1.4932839999999998这显然是错误的!在R中进行乘法给出了1.49324的正确答案。
  • 在Numpy中乘以1.2222 * 1.2222给出1.4937728399999999和1.493773在R中。再一次,R是正确的。

在Numpy中,数字是float64数据类型,它们在R中是双精度的。这是怎么回事?为什么Numpy和R会给出不同的结果?我知道R使用IEEE754双精度,但我不知道Numpy使用的精度。我如何改变Numpy来给我“正确的”答案?

+5

这将有助于显示您的代码,以便我们可以解决您的实际问题。区分浮动如何被打印*与实际浮点*值*之间的区别也很重要。例如,在R中,'sprintf(“%。20f”,1.222 * 1.222)'打印'“1。49328399999999983372“'与{'.20f}'.format(1.222 * 1.222)'在Python中得到的结果完全相同。浮点值是相同的,但是当你在R提示符下输入1.222 * 1.222' ,R打印'1.493284',而Python打印'1.4932839999999998' – unutbu

+0

你也可以尝试将NumPy数据的'dtype'改为'float128':'data = data.astype(np.float128)',虽然它可能有帮助 – unutbu

+0

@unutbu:R使用64位浮点数,因此在Python中坚持使用64位浮点数是合理的。 –

回答

3

的Python

Python中的print声明/功能将打印单精度浮点值。计算实际上将以指定的精度完成。蟒/ numpy的默认使用双精度浮点(至少我的64位机器上):

import numpy 

single = numpy.float32(1.222) * numpy.float32(1.222) 
double = numpy.float64(1.222) * numpy.float64(1.222) 
pyfloat = 1.222 * 1.222 

print single, double, pyfloat 
# 1.49328 1.493284 1.493284 

print "%.16f, %.16f, %.16f"%(single, double, pyfloat) 
# 1.4932839870452881, 1.4932839999999998, 1.4932839999999998 

在一个交互式Python/IPython的壳,壳打印双精度结果的打印语句的结果时:

>>> 1.222 * 1.222 
1.4932839999999998 

In [1]: 1.222 * 1.222 
Out[1]: 1.4932839999999998 

[R

它看起来如R使用printsprintf当是做一样的Python:

print(1.222 * 1.222) 
# 1.493284 

sprintf("%.16f", 1.222 * 1.222) 
# "1.4932839999999998" 
的Python和R之间

> 1.222 * 1.222 
[1] 1.493284 

差异

在搜索结果的差异可能会导致来自:

相较于交互式Python外壳,交互式[R外壳印花语句的结果时,也打印单精度在numpy中使用单精度值。有很多附加的计算/减法将最终使问题面:

In [1]: import numpy 

In [2]: a = numpy.float32(1.222) 

In [3]: a*6 
Out[3]: 7.3320000171661377 

In [4]: a+a+a+a+a+a 
Out[4]: 7.3320003 

正如在评论你的实际问题的建议,请务必使用双精度在numpy的计算浮动。

相关问题