2017-08-19 73 views
1

我得到了python2.7 numpy的陣列非常有線檢測。請看這個代碼。numpy的陣列乘10得到錯誤的結果

import numpy as np 
times = np.arange(5., 85, 0.1) 
print times 
times = np.array(times * 10, dtype=np.int) 
print times 

原來times應該[5.0 ~ 84.9]。乘10後,它應該成爲[50 ~ 849],但結果是這樣的:

[ 50 51 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 ... ]
有之間50

+0

這基本上是一個浮點問題。 '(times * 10)[2]'是'51.999999999999993'。如果你把它當作int來處理,它會返回51,而不是52. – ayhan

回答

3

的問題是,你的第三個項目是不完全52.051.999999999999993(見Is floating point math broken?)。截斷該值因此導致51

正確的方法將是第一輪的值。 (如Safest way to convert float to integer in python?所有足夠小的整數指出,可以精確地表示爲浮動。)因此,你必須計算:times = np.array(np.round(times * 10), dtype=np.int)

+0

非常感謝!我認爲乘以10,我們可以使用+ 0.5,但如何乘以一個變量,而不是10? 我想,以確保計算結果不能在附近的號碼相同的,如果原始數組不一樣。 – sccds

+0

增加0.5適用於所有的正數,因爲它「轉換」截斷的舍入操作。例如0.999得到1.499,將結果截斷爲1.然而,如果使用'np.round'(正如我更新的答案中)那樣性能的小幅下降沒有問題,那麼最好的選擇是(也適用於負數)。 – Stephan