具有给定精度的浮动范围

时间:2017-10-11 12:25:38

标签: python numpy precision

我想创建一个包含[0.000,1.000]范围内所有浮点数的数组,所有浮点数都是3位小数/ 4位精度。

e.g。

>>> np.arange(start=0.000, stop=1.001, decimals=3)
[0.000, 0.001, ..., 0.100, 0.101, ..., 0.900, ..., 0.999, 0.000]

可以做一些与此相关的事情吗?

1 个答案:

答案 0 :(得分:5)

您可以使用np.linspace

>>> import numpy as np
>>> np.linspace(0, 1, 1001)
array([ 0.   ,  0.001,  0.002, ...,  0.998,  0.999,  1.   ])

np.arange使用整数然后除以:

>>> np.arange(0, 1001) / 1000
array([ 0.   ,  0.001,  0.002, ...,  0.998,  0.999,  1.   ])

但是,这不是真正的3位小数,因为所有这些值都是浮点值,并且浮点数不准确。这意味着其中一些数字可能看起来像有3位小数但却没有!

>>> '{:.40f}'.format((np.arange(0, 1001) / 1000)[1])  # show 40 decimals of second element
'0.0010000000000000000208166817117216851329'

NumPy不支持固定小数,因此为了获得“完美结果”,您需要使用Python。例如,包含fractions.Fraction的列表:

>>> from fractions import Fraction
>>> [Fraction(i, 1000) for i in range(0, 1001)]
[Fraction(0, 1), Fraction(1, 1000), ..., Fraction(999, 1000), Fraction(1, 1)]

decimal.Decimal

>>> from decimal import Decimal
>>> [Decimal(i) / 1000 for i in range(1, 1001)]
[Decimal('0.001'), Decimal('0.002'), ..., Decimal('0.999'), Decimal('1')]