如何修改numpy?array的數(shù)據(jù)類型
修改numpy array數(shù)據(jù)類型
1、numpy數(shù)據(jù)類型
數(shù)據(jù)名稱 | 說(shuō)明 |
---|---|
bool | 布爾類型,true,false |
int_ | 默認(rèn)的整數(shù)類型(類似于 C 語(yǔ)言中的 long,int32 或 int64) |
intc | 與 C 的 int 類型一樣,一般是 int32 或 int 64 |
intp | 用于索引的整數(shù)類型(類似于 C 的 ssize_t,一般情況下仍然是 int32 或 int64) |
int8 | 字節(jié)(-128 to 127) |
int16 | 整數(shù)(-32768 to 32767) |
int32 | 整數(shù)(-2147483648 to 2147483647) |
int64 | 整數(shù)(-9223372036854775808 to 9223372036854775807) |
uint8 | 無(wú)符號(hào)整數(shù)(0 to 255) |
uint16 | 無(wú)符號(hào)整數(shù)(0 to 65535) |
uint32 | 無(wú)符號(hào)整數(shù)(0 to 4294967295) |
uint64 | 無(wú)符號(hào)整數(shù)(0 to 18446744073709551615) |
float_ | float64 類型的簡(jiǎn)寫(xiě) |
float16 | 半精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位,5 個(gè)指數(shù)位,10 個(gè)尾數(shù)位 |
float32 | 單精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位,8 個(gè)指數(shù)位,23 個(gè)尾數(shù)位 |
float64 | 雙精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位,11 個(gè)指數(shù)位,52 個(gè)尾數(shù)位 |
complex_ complex128 | 類型的簡(jiǎn)寫(xiě),即 128 位復(fù)數(shù) |
complex64 | 復(fù)數(shù),表示雙 32 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分) |
complex128 | 復(fù)數(shù),表示雙 64 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分) |
2、改變numpy array數(shù)據(jù)類型
用astype()方法改變數(shù)據(jù)類型,如下幾種方式所示(這種方法不會(huì)改變?cè)瓟?shù)組的數(shù)據(jù)類型):
array_name.astype(int) ? array_name.astype(np.int16) array_name.astype('float64')
如果要改變?cè)瓟?shù)組的數(shù)據(jù)類型,用以下方法:
array_name.dtype = np.uint8
numpy數(shù)據(jù)類型說(shuō)明及自動(dòng)轉(zhuǎn)換陷阱
numpy的dtype是一個(gè)很重要的概念,因?yàn)閚umpy為了性能,優(yōu)化了內(nèi)存管理,ndarray的值在內(nèi)存中幾乎是連續(xù)的,同時(shí)其每個(gè)元素的內(nèi)存大小也被設(shè)計(jì)成是一樣的,因此,當(dāng)生成ndarray時(shí),每個(gè)元素的數(shù)據(jù)類型都會(huì)被轉(zhuǎn)為相同的類型,這時(shí)如果原生的數(shù)據(jù)類型是不一樣的,那么就涉及到一個(gè)數(shù)據(jù)類型轉(zhuǎn)換的問(wèn)題,即data type casting。
明白numpy中的數(shù)據(jù)類型轉(zhuǎn)換可以有效的避免和理解很多的行為,因?yàn)閚umpy中很多的error往往都是有數(shù)據(jù)類型轉(zhuǎn)換引起的,所以理解numpy的數(shù)據(jù)類型轉(zhuǎn)換可以預(yù)防和排查很多的問(wèn)題。首先,在numpy中有很多的數(shù)據(jù)類型,多于python內(nèi)置數(shù)據(jù)類型,具體有哪些類型,可以參看下圖,下圖的columns和index是數(shù)據(jù)類型在numpy中的符號(hào),具體的釋義可以查看這里。下面,我們重點(diǎn)講一下numpy中關(guān)于數(shù)據(jù)類型以及轉(zhuǎn)換中容易碰到的陷進(jìn)或者需要注意的點(diǎn)。
1、數(shù)據(jù)類型的表示
在numpy中,一個(gè)數(shù)據(jù)類型實(shí)際上是一個(gè)dtype對(duì)象,其有一些重要的屬性,比如字節(jié)順序、數(shù)據(jù)類型、字節(jié)數(shù)大小等,一般的,numpy中的數(shù)據(jù)類型會(huì)表示成類似'<i4'這樣,這個(gè)表示法中,<表示字節(jié)順序,i表示數(shù)據(jù)類型,這里表示整數(shù),4表示一個(gè)元素占據(jù)的字節(jié)數(shù),這里4字節(jié),表示32位整數(shù)。
2、構(gòu)造ndarray時(shí)的dtype
在構(gòu)造ndarray時(shí),可以指定dtype參數(shù)來(lái)設(shè)置ndarray里面元素的數(shù)據(jù)類型,這個(gè)dtype可以用'i4'這樣的表示方式,也可以用int表示,但是后者沒(méi)法指定字節(jié)數(shù)。要注意的是,指定dtype時(shí),一定要確認(rèn)這個(gè)dtype可以兼容所有元素,防止溢出或者不兼容,對(duì)此我們可以通過(guò)result_type(*array_like)來(lái)判斷我們應(yīng)該設(shè)定的dtype,這個(gè)函數(shù)返回的dtype是可以兼容所有元素的最小size的數(shù)據(jù)類型;或者我們無(wú)需設(shè)定,其會(huì)自動(dòng)進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換,我們也可以通過(guò)ndarray.dtype屬性查看數(shù)據(jù)類型。Anyway,我們要有這種數(shù)據(jù)類型轉(zhuǎn)換的意識(shí),因?yàn)檫@會(huì)影響后續(xù)對(duì)ndarray的操作。
3、不同數(shù)據(jù)類型之間的轉(zhuǎn)換兼容性
numpy的數(shù)據(jù)類型之間能夠?qū)崿F(xiàn)轉(zhuǎn)換,可以通過(guò)np.can_cast(fromtype,totype)這個(gè)函數(shù)來(lái)判斷,更詳細(xì)的可以查看下圖。
4、numpy對(duì)python對(duì)象數(shù)據(jù)類型'O'的處理
當(dāng)numpy中有python獨(dú)有的原生數(shù)據(jù)類型,比如Decimal,那么ndarray會(huì)被轉(zhuǎn)為object數(shù)據(jù)類型,表示python對(duì)象數(shù)據(jù)類型,當(dāng)然這里也可以轉(zhuǎn)為字符串,但是字符串對(duì)于np.nan往往會(huì)占據(jù)更大的itemsize。
當(dāng)numpy函數(shù)對(duì)dtype位object的ndarray處理時(shí),會(huì)先把里面的元素再進(jìn)一步轉(zhuǎn)為其他numpy的數(shù)據(jù)類型,這樣才可以操作,所以這里如果函數(shù)沒(méi)法或沒(méi)有指定類型參數(shù),那么會(huì)默認(rèn)以第一個(gè)inner loop到的數(shù)據(jù)類型作為所有元素的類型,并以此類型進(jìn)行后續(xù)轉(zhuǎn)換,這時(shí),對(duì)于object類型的ndarray來(lái)說(shuō),往往容易出現(xiàn)數(shù)據(jù)無(wú)法轉(zhuǎn)換成功的異常。所以要注意處理時(shí)第一個(gè)inner loop遇到的元素的類型是否可以兼容后面要處理的所有元素,不然會(huì)拋出異常??聪旅娴睦诱f(shuō)明。
import numpy as np from decimal import Decimal arr=np.array([[1,2.0,3],['a',3,np.nan],[2,np.nan,Decimal('5')]]) arr1=np.apply_along_axis(lambda x:x[0],arr=arr,axis=1) arr1 # output: # ValueError: invalid literal for int() with base 10: 'a' arr2=np.apply_along_axis(lambda x:x[1],arr=arr,axis=1) arr2 # output: # array([ 2., 3., nan]) arr2=np.apply_along_axis(lambda x:x[2],arr=arr,axis=1) arr2 # output: # array([ 3, -2147483648, 5])
從上面的例子中可以看到,arr1中,由于第一個(gè)inner loop遇到的元素是整數(shù)1,所以便會(huì)以整數(shù)類型對(duì)后續(xù)的元素進(jìn)行轉(zhuǎn)換,但是后面的一個(gè)元素是字符'a',無(wú)法將其轉(zhuǎn)為int,因此就會(huì)報(bào)上述error;arr2中,第一個(gè)遇到的元素是2.0,為float,所以后面的元素都會(huì)被轉(zhuǎn)為float,因此輸出為array([ 2., 3., nan]),其中都變成了float,要注意的是,由于np.nan本身就是一個(gè)浮點(diǎn)數(shù),因此這里可以正確的轉(zhuǎn)換,轉(zhuǎn)換之后還是np.nan;但是看arr2,由于第一個(gè)遇到的元素類型為int32,后面的np.nan為float64,會(huì)造成溢出,這樣便無(wú)法正確的轉(zhuǎn)換,從而會(huì)用int32最接近np.nan的值去替換,所以就是-2**31==-2147483648,這里之所以是2**31,而不是2**32-1,是因?yàn)檫@里的int是signed int,即有正負(fù)號(hào)的int,所以其范圍是-2**31~2**31-1;而Decimal('5')被轉(zhuǎn)為了int 5,所以就出現(xiàn)了上述的結(jié)果。
所以,當(dāng)要被轉(zhuǎn)成ndarray的原始數(shù)據(jù)中有np.nan時(shí),要特別注意這一點(diǎn),最好是指定float類型,注意其他數(shù)據(jù)的兼容;而如果同時(shí)又是obejct數(shù)據(jù)類型時(shí),那么同時(shí)也要注意第一個(gè)inner loop遇到的元素的數(shù)據(jù)類型,注意和后面的數(shù)據(jù)類型保持兼容。
小結(jié):numpy的dtype有諸多陷進(jìn),需要小心對(duì)待,謹(jǐn)慎核查,然后靈活運(yùn)用。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch 實(shí)現(xiàn)模型不同層設(shè)置不同的學(xué)習(xí)率方式
今天小編就為大家分享一篇pytorch 實(shí)現(xiàn)模型不同層設(shè)置不同的學(xué)習(xí)率方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python特性之列表推導(dǎo)式和生成器表達(dá)式詳解
這篇文章主要介紹了python語(yǔ)言的兩個(gè)非常有用的特性:列表推導(dǎo)式和生成器表達(dá)式,但是它們之間也有一些重要的區(qū)別,我們一起來(lái)看看吧2023-08-08python遞歸&迭代方法實(shí)現(xiàn)鏈表反轉(zhuǎn)
這篇文章主要介紹了python遞歸&迭代方法實(shí)現(xiàn)鏈表反轉(zhuǎn),文章分享一段詳細(xì)實(shí)現(xiàn)代碼,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助2022-02-02python運(yùn)行cmd命令行的3種方法總結(jié)
雖然python在調(diào)用cmd命令方面使用的比較少,不過(guò)還是要用的,下面這篇文章主要給大家介紹了關(guān)于python運(yùn)行cmd命令行的3種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09python編程實(shí)現(xiàn)隨機(jī)生成多個(gè)橢圓實(shí)例代碼
這篇文章主要介紹了python編程實(shí)現(xiàn)隨機(jī)生成多個(gè)橢圓實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01python查找目錄下指定擴(kuò)展名的文件實(shí)例
這篇文章主要介紹了python查找目錄下指定擴(kuò)展名的文件,實(shí)例分析了Python文件查詢的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04