我有一個 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]
我的問題是,我怎樣才能避免這種情況,如果有人出于純粹的興趣知道為什么會發生這種情況。非常感謝您的幫助。
uj5u.com熱心網友回復:
這個問題通常與浮點有關(3 * .1在您的 Python 控制臺中執行)。在您的情況下,您可以簡單地除以 10 而不是乘以 0.1。
a = np.array([3, 5, 7, 9]) / 10
另請參閱:浮點錯誤緩解 小數模塊
uj5u.com熱心網友回復:
這不是 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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/350885.html
