[英]Floating point inconsistencies when converting a NumPy array to a list
我有一個由python numpy生成的間隔范圍。 這些值與預期的一樣,但是當將數組轉換為列表時,這些值與數組中的值不同。
numpy.linspace(0.3,0.7,5)
array([ 0.3, 0.4, 0.5, 0.6, 0.7])
numpy.linspace(0.3,0.7,5).tolist()
[0.3, 0.39999999999999997, 0.5, 0.6, 0.7]
list(numpy.linspace(0.3,0.7,5))
[0.29999999999999999,0.39999999999999997,0.5,0.59999999999999998,
0.69999999999999996]
為什么numpy會這樣? 無論如何,是否要使列表中的值與數組相同,而無需使用另一個循環來四舍五入列表中的值?
碰巧是由於數據類型和每種類型的相應__repr__
實現:
l = numpy.linspace(0.3,0.7,5).tolist()
[type(x) for x in l]
[float, float, float, float, float]
在第一種情況下, tolist
將每個np.float
對象轉換為python float
對象,其__repr__
實現會根據Gay算法自動截斷浮點數。 OTOH:
l = list(numpy.linspace(0.3,0.7,5))
[type(x) for x in l]
[numpy.float64, numpy.float64, numpy.float64, numpy.float64, numpy.float64]
僅在數組周圍調用list
不會將列表元素轉換為float
,而是保留其原始np.float
類型,它們具有不同的表示形式。 請記住,第二種情況下的浮點表示是它們在內存中的實際表示方式:
import decimal
decimal.Decimal(0.3)
Decimal('0.299999999999999988897769753748434595763683319091796875')
因為許多浮點數沒有確切的位表示形式。 請參閱我們鍾愛的規范浮點數學是否已損壞? 更多細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.