据我所知,NumPy浮点数组元素的精度受机器epsilon的限制。
但是,我很难理解为什么将数组的数据类型指定为Python对象而不是默认的浮点数会导致数组存储我提供的精确值。有人可以解释一下这种行为吗?
下面的代码说明了与float数据类型相关的舍入错误,以及使用object数据类型时的精度变化。
import numpy as np
np.set_printoptions(precision=64)
MyArray = np.empty(2)
MyArray.fill(0.442)
print(MyArray)
# [ 0.442000000000000003996802888650563545525074005126953125
# 0.442000000000000003996802888650563545525074005126953125]
MyArray_precise = np.empty(2, dtype = object)
MyArray_precise.fill(0.442)
print(MyArray_precise)
# [0.442 0.442]
我在64位Windows上运行32位Python 2.7.12安装。
答案 0 :(得分:3)
这只是你看到的显示格式问题。无论如何,你实际上并没有获得更精确的数字;只是您设置的limit 1
显示设置不适用于对象数组。它仅适用于浮点dtype数组。
如果您打印precision=64
的内容的更多数字:
MyArray_precise
你会发现它实际上并不比其他阵列更好。
答案 1 :(得分:0)
我同意浮动的问题是显示问题,而不是精确问题。
但长整数存在不同的问题。 Python有一个长整数类型,没有numpy
dtype。
In [87]: x=12312312312311231231241241242342
In [88]: x
Out[88]: 12312312312311231231241241242342
这是Py3。 Py2将其显示为12312312312311231231241241242342L
In [90]: np.array([x])
Out[90]: array([12312312312311231231241241242342], dtype=object)
In [91]: np.array([x],int)
....
OverflowError: Python int too large to convert to C long