这不是 Numpy 的问题。相反,这是Python 和其他语言中浮点值的一个众所周知的问题。
您可以在 Python 终端中尝试此操作。
>>> 3 * 0.1
0.30000000000000004
但是,这里有区别。
这里的区别在于 Numpy 和 Python 如何表示这些值。
当您打印一个 Numpy 数组时,它会传递该数组np.array_repr
并返回该数组的字符串表示形式。
注意参数precision
。默认情况下,它设置为numpy.get_printoptions()['precision']
或8
。
>>> np.get_printoptions()['precision']
8
这是在精度之前的17
方式0.30000000000000004
。因此,我们看到的结果四舍五入为0.3
。
让我们尝试更多precision
设置。
>>> a = np.array([3, 5, 7, 9]) * 0.1
precision=17
>>> print(np.array_repr(a, precision=17))
array([0.30000000000000004, 0.5, 0.7000000000000001, 0.9])
precision=16
>>> print(np.array_repr(a, precision=16))
arrayarray([0.3, 0.5, 0.7000000000000001, 0.9])
precision=15
>>> print(np.array_repr(a, precision=15))
array([0.3, 0.5, 0.7, 0.9])
当您将 Numpy 数组转换为列表时,由于列表在表示值时没有精度功能,因此列表中的浮点值将按原样显示。
如果您希望在转换为列表时值看起来相同,请至少将它们四舍五入到小数点后八位。
>>> print(list(np.round(a, 8)))
[0.3, 0.5, 0.7, 0.9]