2015-08-28 1014 views
3

我想了解Numpy中dtypes的邏輯。numpy.array()中的dtype參數

numpy.min_scalar_type(10) 
-> uint8 

和:

a = numpy.array([10]) 
print(a.dtype) 
-> int32 (on my machine) 

我期待uint8代替int32,由於(1.9)醫生說:

numpy.array(對象,D型細胞=無。 ..)

dtype:data-type,可選。數組所需的數據類型。如果沒有給出 ,那麼類型將被確定爲以保持序列

和中的對象所要求的最小類型 :

numpy.min_scalar_type的(a)

對於標量a,返回最小尺寸的數據類型和可保存其值的最小標量類型。

...

返回:out:dtype。最小的數據類型。

我誤解了什麼嗎?

+0

我爲'a.dtype'獲得'int64' – Paul

+0

@Paul。它依賴於Python版本。 –

+1

這有點含糊,但我認爲這裏要理解的關鍵是'最小類型'和'最小尺寸'的最小類型通常是不同的。 'np.array'給你'最小類型'。最小類型是整數,它不會給你最小的整數類型(這是完全合理的)。 – cel

回答

2

python列表可以包含不同類型的對象,例如, X = ['apples', 'oranges',10]。如果你做type([10]),你會看到容器的Python類型在技術上被稱爲列表,而不是數組。

相比之下,在一個numpy數組中,所有對象都是相同類型的dtype。

文檔告訴你,在創建一個numpy數組時,dtype被設置爲將保存所有現有的對象的類型。

看看,找找:

的類型將被確定爲保持序列

作家或許應該補充「,而不是它們的值中的對象所需的最小類型「

我們可以做一個UINT8 10很輕鬆地:

ten = np.uint8(10) 

如果將其放入Python列表中,它將保留其類型,因爲Python列出的是保留類型。如果該列表發送到numpy.array()以製作一個numpy數組,那麼numpy數組將使用dtype np.uint8,因爲它足夠大以容納全部(1)預先存在的Python列表對象。

In [49]: np.array([ten]).dtype 
Out[49]: dtype('uint8') 

但是如果我們用一個文字10,Python會爲它創建一個int對象,而不是一個np.uint8因爲np.uint8是特有的numpy的所有10確實是調用Python創建該號碼。

如果我們包含文字10 Python列表,我們重複你的結果(與機器架構整數):

In [50]: np.array([10]).dtype 
Out[50]: dtype('int64') 

如果我們把兩種一起在一個Python列表,併發送列表np.array創建一個numpy數組,然後dtype必須足夠大,以容納這兩個對象,在這種情況下int64。

In [51]: np.array([ten, 10]).dtype 
Out[51]: dtype('int64') 
+1

這是一個非常好的解釋! –

+0

謝謝。我很高興你得到它。 – Paul

+0

我會寫'Python list'而不是'Python array'。有一個不太常用的'Array'模塊。 – hpaulj