np.arange的怪异行为

时间:2018-04-26 13:32:45

标签: python numpy precision

我正在尝试制作一个N + 1个数组的数组,用于分配N个离散分数。

我认为numpy的arange可以用于此。但是,该函数给出了奇数值,这对得到的numpy直方图有显着影响。这是一个最小的例子:

n = 10
a = np.arange(0, 1.01 + 1/n, 1/n)

print(a)
for i in a:
    print(i)
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.  1.1]

0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6000000000000001
0.7000000000000001
0.8
0.9
1.0
1.1

简单地打印数组输出看似正常的值这一事实更具误导性。如果我想将此数组用作numpy的bins函数的histogram()参数,这是一个大问题,因为我的值是k / 10十进制数。特别是,所有值为0.7的数据点都将放在[0.6000000000000001, 0.7000000000000001] bin中,而我希望它们位于[0.7, 0.8]内,如np.histogram()文档所示。

问题是这是一个错误还是一个功能。

2 个答案:

答案 0 :(得分:1)

问题在于很难将某些小数精确地表示为二进制浮点数 - 因此它们被转换为足够接近的浮点数。

当您在不设置明确的精度限制的情况下打印它们时,它们可能会转换为与预期数字略有不同的十进制表示。

将精度设置为例如5个小数点,使用print('{:.5g}'.format(i))

答案 1 :(得分:1)

这与numpy完全无关,这些数字的二进制表示在计算机世界中并不完全。

例如,0.3不能用有限数字表示。所以这就是为什么你得到那些接近你期望但不完全正确的结果的原因。

当你看到这个时,你会感到惊讶:

>>> print('{:.50}'.format(0.3))
0.2999999999999999888977697537484345957636833190918