簡體   English   中英

將NumPy數組轉換為列表時的浮點不一致

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM