[英]Python Numpy array equality failure
為什么會失敗? 我建立一個數組,創建與該陣列減去從陣列內的值的新的變量,然后陣列比較, 似乎是在陣列中的值。 那么,為什么平等測試失敗了?
import numpy as np
import platform
print platform.python_version()
print np.__version__
x = np.arange( -1,1,0.1 )
new_x = x - x[5]
print new_x
print new_x == -0.2
輸出:
2.7.9
1.9.2
[-0.5 -0.4 -0.3 -0.2 -0.1 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4]
[False False False False False False False False False False False False False False False False False False False False]
編輯:使用np.round()導致比較行為符合預期; 現在的問題是,為什么在打印數組時為什么會顯示四舍五入的數字? 以我的經驗,當數字不准確時,python通常會打印科學計數法或僅顯示一堆小數位。
令人震驚的是,我用Python進行科學編程已有6年了,從未見過! 感覺像是一個菜鳥問題,但我真的不明白為什么印刷的內容是四舍五入的。
您可能會懷疑,這種奇怪的行為是由於在浮點計算過程中發生了小的精度誤差。 要查看差異,可以使用float.hex()
將浮點數轉換為十六進制形式:
>>> new_x[3].hex()
'-0x1.9999999999998p-3'
>>> (-0.2).hex()
'-0x1.999999999999ap-3'
注意,它們實際上是兩個不同的浮點數。 “舍入”僅在打印時發生,實際上是Python本身默認執行的操作 。 基本思想是Python對象(包括浮點數)有兩種形式的字符串表示形式: str
和repr
。 repr
應該返回“真實的”,可再現的字符串表示形式,而str
應該針對人類可讀性進行優化-其中一部分包括“取整”以隱藏較小的精度錯誤。 注意:
>>> repr(new_x[3])
'-0.19999999999999996'
>>> repr(-0.2)
'-0.2'
對於浮點數,您可以使用numpy.isclose()
模擬相等性檢查,如下所示:
>>> print numpy.isclose(new_x, -0.2)
[False False False True False False False False False False False False
False False False False False False False False]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.