2015-11-25 31 views
1

我經常使用numpy,最近通過處理數據類型之間的轉換的方式避免了這種轉換。陣列與標量的numpy類型轉換

假設我有一個無符號的8位整數(uint8),其值爲252.讓我們創建一個新的變量,將其遞增10,並打印變量及其類型的值。我不明白這裏會發生什麼,因爲252 + 10> 255(uint8的最大值)。然而我們看到加法「正常」發生,產生了262.新變量是64位整數:

>>> import numpy as np 
>>> a = np.uint8(252) 
>>> b = a + 10 
>>> print (b, type(b)) 
262 <class 'numpy.int64'> 

好的。讓我們嘗試一個稍微不同的實驗。這次我將252放入一個數組中,並執行相同的添加。我們在下面看到,結果現在是6而不是262,這意味着添加已經「纏繞」零。結果數組仍然是uint8類型。

>>> c = np.array([1,2,252], dtype='uint8') 
>>> d = c + 10 
>>> print (d[2], np.dtype(d[2])) 
6 uint8 

我的問題是:是否有一個很好的理由numpy的行爲,這些案件之間的區別?也許更好的問題是:無論原因是否好,決定何時進行這種轉換的規則是什麼?它真的只是數組和標量行爲嗎?

+0

要添加到您的困惑,還是不行,讓''10' uint8',然後嘗試附加。 – hpaulj

回答

0

b = a + 10 

b具有10類型,這是Python的INT,相當於np.int32。這種情況發生時,即使其結果是在np.uint8範圍:

In [151]: type(a-10) 
Out[151]: numpy.int32 
In [152]: np.promote_types(np.uint8,int) 
Out[152]: dtype('int32') 

換句話說,添加(或以其他方式組合),並用intuint8產生int

b = a + np.uint8(10) 

產生一個運行時溢出警告(第一時間)和buint8(6)

添加10陣列返回相同的D型

c + 10 

不過需要注意的另一個數組:

In [127]: np.array(252,np.uint8)+10 
Out[127]: 262        # like the scalar case 
In [128]: np.array([1,252],np.uint8)+10 
Out[128]: array([11, 6], dtype=uint8) 
In [134]: np.array([252],np.uint8)+10 
Out[134]: array([6], dtype=uint8) 

有一堆numpy鑄造規則。我沒有太注意它們,但是有一些搜索可以在numpy文檔中找到。

np.result_type是檢查這些行爲的另一種方式。它是doc可能是組合數組和標量時發生的情況的描述。

In [157]: np.result_type(np.array([252],np.uint8), np.array(10)) 
Out[157]: dtype('uint8') 
In [158]: np.result_type(np.array(252,np.uint8), np.array(10)) 
Out[158]: dtype('int32') 

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.result_type.html#numpy.result_type

相關問題