2017-08-16 91 views
1

我完全被這個困惑了。numpy.array有和沒有指定dtype表現奇怪

從以下

import numpy as np 

a = np.array([4, -9]) 
a[0] = 0.4 
a 

預期輸出:array([ 0.4, -9])。但它給我

array([ 0, -9])

但是,當我改變了dtypef

a = np.array([4, -9], 'f') 
a[0] = 0.4 
a 

它給了我的預期了放array([ 0.40000001, -9. ], dtype=float32)

的文檔numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)說:

D型:數據類型,可選 陣列所需的數據類型。如果沒有給出,那麼類型將被確定爲保持序列中對象所需的最小類型。這個參數只能用於'上傳'數組。對於向下轉換,請使用.astype(t)方法。

當我初始化數組初始化它的值integers,所以當我索引與float陣列只承認0.4integer一部分,因此給了我0。這是我的理解。它是否正確?。但我仍然對這種行爲感到驚訝。

問題:這裏究竟發生了什麼?

回答

1

的問題是,你的陣列是dtype=np.int64

In [141]: a = np.array([4, -9]) 

In [142]: a.dtype 
Out[142]: dtype('int64') 

這意味着你可以轉讓完成之前只能存儲整數,浮點數任何被截斷。如果你想存儲花車和整數一起,你應該指定dtype=object第一:

In [143]: a = np.array([4, -9], dtype=object) 

In [144]: a[0] = 0.4 

In [145]: a 
Out[145]: array([0.4, -9], dtype=object) 

至於與array([ 0.40000001, -9. ]0.4問題,作爲一個浮點數沒有在內存中一個精確的表示(只是一個大概的一個),這說明你看到的不準確。

+0

非常好。這解決了這個問題。顯然,我需要學習很多東西。 – minibuffer

+0

我不喜歡使用'dtype = object'來保存浮動和整數的想法。如果需要,可以混合字符串和數字,或者更好地保存列表等內容。但對於純數字數據,最好使用數字dtype。 – hpaulj

+0

@hpaulj接受。使用非數字類型,您將失去所有矢量化優勢。 –