Numpy數據類型
numpy是一個python擴展包,它可以為我們提供更精確的科學技術,更強大的數學能力。為此,numpy定義了比python更豐富的數據類型來達成目的。
以上就是一系列Numpy中提供的數據類型。需要理解的是,Numpy中的數據類型,和python本身的數據類型是不同的。Numpy中的數據類型,實質是數據類型對象dtype的實例。
Numpy中的Ndarray對象可以幫助我們構建N維數組對象。我們知道,對於數組來說,最大特點是,對於給定長度的數組,其在內存中所佔用的空間大小是預先分配的,並且,每個元素所佔用的空間大小是相當的。
那麼,Ndarray怎麼計算每個元素所佔用的空間大小呢?就是根據dtype。換句話說,dtype定義中,應該包含類型的名字,並且,能夠明確該類型實例佔用的內存空間大小。
另外,dtype中還表明了數據的字節順序。什麼是字節順序呢?我們知道,對於機器來說,正常的人類語言是無法直接被識別或存儲的。需要轉換成二進位01代碼。這種二進位01代碼稱為機器語言,也叫字節碼。對於一個特定的正常語言,轉換成一系列01代碼後,可以正向存放,也可以逆向存放。低位放在最前,稱之為小端法,高位放在最前,則稱之為大端法。
在numpy,core包的multiarray_umath.py模塊中,可以找到dtype類的定義。有興趣的同學可以嘗試閱讀一下其源碼。讀源碼其實是一種有效的學習編程的方式。
Numpy數據類型的簡單案例
案例一:numpy.bool_和bool有區別
上面的demo不會報錯,這容易讓人誤以為,bool可能是numpy中bool_的簡寫,事實上,二者是兩個不同的對象。bool_是由numpy定義的,而bool則是由python標準庫定義的。
額外補充一點關於python數據類型的內容。我們知道,python中,有一系列基本數據類型,如數字,字符串,列表,元組,字典,集合等。而又與之對應,創建了一系列對象,幫助使用,如int,float,complex,str,list,tuple,dict,set等。bool也是一個,只不過,查看源碼你會發現,int,float等,都是以object為父類的,而bool,則是以int為父類的。這正是python一切皆對象的表現之一。
案例二:使用字符串碼
字符串碼可以幫助建立一個dtype對象實例,還可以同時指定其字節碼順序。字符串碼一般比原數據類型的標識符要短。
比如說,int類型的字符串碼為i,可以通過以下方式創建:
我們發現,通過字符串碼i,創建了一個int32,你也可以通過i3來創建int32,通過i1創建int8,通過i2創建int16,通過i4創建int64。規律就是i其實是int的首字母,後面的數字其實是字節的長度,8位是1個字節,16位是兩個字節,32位是三個字節……
大部分的情況下是可以通過這種規律來幫助記憶的。事實上,用多了,自然也就記住了。常用列表如下:
通過在字符串碼前加大於或小於號來指定字節排序,小於代表小端法,大於代表大端法,如下:
其實在大部分場景下,我們不需要關注字節的排序,這時候,直接通過np的對象來創建就好,這樣也不用去記憶或查詢字符串碼了。