NumPy之:標量scalars

簡介

Python語言中只定義了特定數據類的一種類型(好比只有一種整數類型,一種浮點類型等)。在不須要關注計算機中數據表示方式的普通應用程序中,這樣作很方便。可是,對於科學計算來講,咱們須要更加精確的控制類型。python

在NumPy中,引入了24種新的Python scalar類型用於更加準確的描述數據。這些類型都是能夠直接在NumPy中的數組中使用的,因此也叫Array scalar類型。數組

本文將會詳細講解這24種scalar類型。ui

scalar類型的層次結構

先看一個張圖,看下scalar類型的層次結構:spa

上面實線方框括起來的,就是scalar類型。 這些標量類型,均可以經過 np.type來訪問,好比:scala

In [130]: np.intc
Out[130]: numpy.int32

細心的小夥伴可能要問了,這不對呀,實線方框括起來的只有22中類型,還有兩個類型是什麼?指針

還有兩個是表明整數指針的 intpuintpcode

注意,array scalars 類型是不可變的。

咱們能夠isinstance來對這些數組標量來進行層次結構的檢測。orm

例如,若是val是數組標量對象,則isinstance(val,np.generic)將返回True。若是val是複數值類型,則isinstance(val,np.complexfloating)將返回True。對象

內置Scalar類型

咱們用下面的表來展現內置的Scalar類型和與他們相對應的C類型或者Python類型。最後一列的字符代碼是類型的字符表示,在有些狀況好比構建dtype中會使用到。繼承

boolean

類型 描述 字符代碼
bool_ compatible: Python bool '?'
bool8 8 bits

Integers

類型 描述 字符代碼
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

Unsigned integers

類型 描述 字符代碼
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

Floating-point numbers

類型 描述 字符代碼
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?

Complex floating-point numbers

類型 描述 字符代碼
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?

Python 對象

類型 描述 字符代碼
object_ any Python object 'O'

對於數組中的對象類型object_來講,存儲的數據實際上是Python對象的引用,因此說他們的對象類型必須一致。

雖然存儲的是引用,可是在取值訪問的時候,返回的就是對象自己。

能夠看到對於數字類型來講,int,uint,float,complex,後面能夠跟上具體的數組,表示特定的長度。

intpuintp 是兩個指向整數的指針。

有些類型和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/

最通俗的解讀,最深入的乾貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!

歡迎關注個人公衆號:「程序那些事」,懂技術,更懂你!

相關文章
相關標籤/搜索