Python語言中只定義了特定數據類的一種類型(好比只有一種整數類型,一種浮點類型等)。在不須要關注計算機中數據表示方式的普通應用程序中,這樣作很方便。可是,對於科學計算來講,咱們須要更加精確的控制類型。python
在NumPy中,引入了24種新的Python scalar類型用於更加準確的描述數據。這些類型都是能夠直接在NumPy中的數組中使用的,因此也叫Array scalar類型。數組
本文將會詳細講解這24種scalar類型。ui
先看一個張圖,看下scalar類型的層次結構:spa
上面實線方框括起來的,就是scalar類型。 這些標量類型,均可以經過 np.type
來訪問,好比:scala
In [130]: np.intc Out[130]: numpy.int32
細心的小夥伴可能要問了,這不對呀,實線方框括起來的只有22中類型,還有兩個類型是什麼?指針
還有兩個是表明整數指針的 intp
和 uintp
。code
注意,array scalars 類型是不可變的。
咱們能夠isinstance來對這些數組標量來進行層次結構的檢測。orm
例如,若是val是數組標量對象,則isinstance(val,np.generic)將返回True。若是val是複數值類型,則isinstance(val,np.complexfloating)將返回True。對象
咱們用下面的表來展現內置的Scalar類型和與他們相對應的C類型或者Python類型。最後一列的字符代碼是類型的字符表示,在有些狀況好比構建dtype中會使用到。繼承
類型 | 描述 | 字符代碼 |
---|---|---|
bool_ |
compatible: Python bool | '?' |
bool8 |
8 bits |
類型 | 描述 | 字符代碼 |
---|---|---|
byte |
compatible: C char | 'b' |
short |
compatible: C short | 'h' |
intc |
compatible: C int | 'i' |
int_ |
compatible: Python int | 'l' |
longlong |
compatible: C long long | 'q' |
intp |
large enough to fit a pointer | 'p' |
int8 |
8 bits | |
int16 |
16 bits | |
int32 |
32 bits | |
int64 |
64 bits |
類型 | 描述 | 字符代碼 |
---|---|---|
ubyte |
compatible: C unsigned char | 'B' |
ushort |
compatible: C unsigned short | 'H' |
uintc |
compatible: C unsigned int | 'I' |
uint |
compatible: Python int | 'L' |
ulonglong |
compatible: C long long | 'Q' |
uintp |
large enough to fit a pointer | 'P' |
uint8 |
8 bits | |
uint16 |
16 bits | |
uint32 |
32 bits | |
uint64 |
64 bits |
類型 | 描述 | 字符代碼 |
---|---|---|
half |
'e' |
|
single |
compatible: C float | 'f' |
double |
compatible: C double | |
float_ |
compatible: Python float | 'd' |
longfloat |
compatible: C long float | 'g' |
float16 |
16 bits | |
float32 |
32 bits | |
float64 |
64 bits | |
float96 |
96 bits, platform? | |
float128 |
128 bits, platform? |
類型 | 描述 | 字符代碼 |
---|---|---|
csingle |
'F' |
|
complex_ |
compatible: Python complex | 'D' |
clongfloat |
'G' |
|
complex64 |
two 32-bit floats | |
complex128 |
two 64-bit floats | |
complex192 |
two 96-bit floats, platform? | |
complex256 |
two 128-bit floats, platform? |
類型 | 描述 | 字符代碼 |
---|---|---|
object_ |
any Python object | 'O' |
對於數組中的對象類型
object_
來講,存儲的數據實際上是Python對象的引用,因此說他們的對象類型必須一致。雖然存儲的是引用,可是在取值訪問的時候,返回的就是對象自己。
能夠看到對於數字類型來講,int,uint,float,complex,後面能夠跟上具體的數組,表示特定的長度。
intp 和 uintp 是兩個指向整數的指針。
有些類型和Python自帶的類型基本上是等價的,事實上這些類型就是繼承自Python自帶的類型:
Array scalar type | Related Python type |
---|---|
int_ |
IntType (Python 2 only) |
float_ |
FloatType |
complex_ |
ComplexType |
bytes_ |
BytesType |
unicode_ |
UnicodeType |
有一個特例就是bool_ ,它和Python的 BooleanType 很是相似,但並非繼承自BooleanType。由於Python的BooleanType 是不容許被繼承的。而且二者底層的數據存儲長度也是不同的。
雖然在Python中bool是int的子類。可是在NumPy中 bool_ 並非
int_
的子類,bool_ 甚至不是一個number 類型。在Python 3 中,
int_
再也不繼承 Python3 中的int
了,由於int
再也不是一個固定長度的整數。NumPy 默認的數據類型是 float_。
下面的三種數據類型長度是可變的,
類型 | 描述 | 字符代碼 |
---|---|---|
bytes_ |
compatible: Python bytes | 'S#' |
unicode_ |
compatible: Python unicode/str | 'U#' |
void |
'V#' |
字符代碼中的 # 表示的是數字。
上面描述的字符代碼,爲了和Python的其餘模塊進行兼容,好比struct ,須要進行下面適當的修正:
c -> S1
,b -> B
,1 -> b
,s -> h
,w -> H
, 和u -> I
.
本文已收錄於 http://www.flydean.com/03-python-numpy-scalar/
最通俗的解讀,最深入的乾貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!
歡迎關注個人公衆號:「程序那些事」,懂技術,更懂你!