2

我有一个 Numpy 数组,它是通过将 Numpy 数组与浮点数相乘而获得的。

a = np.array([3, 5, 7, 9]) * 0.1

结果数字是精确的,没有任何四舍五入。

>>> a
array([0.3 0.5 0.7 0.9])

但是,如果我将数组变成带有 的列表,则在我的列表中a.tolist()会有条目0.30000000000000004而不是0.3.

>>> a.tolist()
[0.30000000000000004, 0.5, 0.7000000000000001, 0.9]

我的问题是,我怎样才能避免这种情况,如果有人出于纯粹的兴趣知道为什么会发生这种情况。非常感谢您的帮助。

4

2 回答 2

0

这个问题通常伴随着浮点数(3 * .1在你的 Python 控制台中执行)。在您的情况下,您可以简单地除以 10 而不是 0.1 的倍数。

a = np.array([3, 5, 7, 9]) / 10

另请参阅:浮点错误缓解 十进制模块

于 2021-11-03T12:48:02.787 回答
0

这不是 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]
于 2021-11-03T13:21:13.147 回答