欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何修改numpy?array的數(shù)據(jù)類型

 更新時間:2022年05月19日 08:46:18   作者:ACE-Mayer  
這篇文章主要介紹了如何修改numpy?array的數(shù)據(jù)類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

修改numpy array數(shù)據(jù)類型

1、numpy數(shù)據(jù)類型

數(shù)據(jù)名稱說明
bool布爾類型,true,false
int_默認的整數(shù)類型(類似于 C 語言中的 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無符號整數(shù)(0 to 255)
uint16無符號整數(shù)(0 to 65535)
uint32無符號整數(shù)(0 to 4294967295)
uint64無符號整數(shù)(0 to 18446744073709551615)
float_float64 類型的簡寫
float16半精度浮點數(shù),包括:1 個符號位,5 個指數(shù)位,10 個尾數(shù)位
float32單精度浮點數(shù),包括:1 個符號位,8 個指數(shù)位,23 個尾數(shù)位
float64雙精度浮點數(shù),包括:1 個符號位,11 個指數(shù)位,52 個尾數(shù)位
complex_ complex128類型的簡寫,即 128 位復數(shù)
complex64復數(shù),表示雙 32 位浮點數(shù)(實數(shù)部分和虛數(shù)部分)
complex128復數(shù),表示雙 64 位浮點數(shù)(實數(shù)部分和虛數(shù)部分)

2、改變numpy array數(shù)據(jù)類型

用astype()方法改變數(shù)據(jù)類型,如下幾種方式所示(這種方法不會改變原數(shù)組的數(shù)據(jù)類型):

array_name.astype(int) ?
array_name.astype(np.int16)
array_name.astype('float64')

如果要改變原數(shù)組的數(shù)據(jù)類型,用以下方法:

array_name.dtype = np.uint8

numpy數(shù)據(jù)類型說明及自動轉(zhuǎn)換陷阱

numpy的dtype是一個很重要的概念,因為numpy為了性能,優(yōu)化了內(nèi)存管理,ndarray的值在內(nèi)存中幾乎是連續(xù)的,同時其每個元素的內(nèi)存大小也被設計成是一樣的,因此,當生成ndarray時,每個元素的數(shù)據(jù)類型都會被轉(zhuǎn)為相同的類型,這時如果原生的數(shù)據(jù)類型是不一樣的,那么就涉及到一個數(shù)據(jù)類型轉(zhuǎn)換的問題,即data type casting。

明白numpy中的數(shù)據(jù)類型轉(zhuǎn)換可以有效的避免和理解很多的行為,因為numpy中很多的error往往都是有數(shù)據(jù)類型轉(zhuǎn)換引起的,所以理解numpy的數(shù)據(jù)類型轉(zhuǎn)換可以預防和排查很多的問題。首先,在numpy中有很多的數(shù)據(jù)類型,多于python內(nèi)置數(shù)據(jù)類型,具體有哪些類型,可以參看下圖,下圖的columns和index是數(shù)據(jù)類型在numpy中的符號,具體的釋義可以查看這里。下面,我們重點講一下numpy中關(guān)于數(shù)據(jù)類型以及轉(zhuǎn)換中容易碰到的陷進或者需要注意的點。

1、數(shù)據(jù)類型的表示

在numpy中,一個數(shù)據(jù)類型實際上是一個dtype對象,其有一些重要的屬性,比如字節(jié)順序、數(shù)據(jù)類型、字節(jié)數(shù)大小等,一般的,numpy中的數(shù)據(jù)類型會表示成類似'<i4'這樣,這個表示法中,<表示字節(jié)順序,i表示數(shù)據(jù)類型,這里表示整數(shù),4表示一個元素占據(jù)的字節(jié)數(shù),這里4字節(jié),表示32位整數(shù)。

2、構(gòu)造ndarray時的dtype

在構(gòu)造ndarray時,可以指定dtype參數(shù)來設置ndarray里面元素的數(shù)據(jù)類型,這個dtype可以用'i4'這樣的表示方式,也可以用int表示,但是后者沒法指定字節(jié)數(shù)。要注意的是,指定dtype時,一定要確認這個dtype可以兼容所有元素,防止溢出或者不兼容,對此我們可以通過result_type(*array_like)來判斷我們應該設定的dtype,這個函數(shù)返回的dtype是可以兼容所有元素的最小size的數(shù)據(jù)類型;或者我們無需設定,其會自動進行數(shù)據(jù)類型的轉(zhuǎn)換,我們也可以通過ndarray.dtype屬性查看數(shù)據(jù)類型。Anyway,我們要有這種數(shù)據(jù)類型轉(zhuǎn)換的意識,因為這會影響后續(xù)對ndarray的操作。

3、不同數(shù)據(jù)類型之間的轉(zhuǎn)換兼容性

 numpy的數(shù)據(jù)類型之間能夠?qū)崿F(xiàn)轉(zhuǎn)換,可以通過np.can_cast(fromtype,totype)這個函數(shù)來判斷,更詳細的可以查看下圖。

4、numpy對python對象數(shù)據(jù)類型'O'的處理

 當numpy中有python獨有的原生數(shù)據(jù)類型,比如Decimal,那么ndarray會被轉(zhuǎn)為object數(shù)據(jù)類型,表示python對象數(shù)據(jù)類型,當然這里也可以轉(zhuǎn)為字符串,但是字符串對于np.nan往往會占據(jù)更大的itemsize。

當numpy函數(shù)對dtype位object的ndarray處理時,會先把里面的元素再進一步轉(zhuǎn)為其他numpy的數(shù)據(jù)類型,這樣才可以操作,所以這里如果函數(shù)沒法或沒有指定類型參數(shù),那么會默認以第一個inner loop到的數(shù)據(jù)類型作為所有元素的類型,并以此類型進行后續(xù)轉(zhuǎn)換,這時,對于object類型的ndarray來說,往往容易出現(xiàn)數(shù)據(jù)無法轉(zhuǎn)換成功的異常。所以要注意處理時第一個inner loop遇到的元素的類型是否可以兼容后面要處理的所有元素,不然會拋出異常??聪旅娴睦诱f明。

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中,由于第一個inner loop遇到的元素是整數(shù)1,所以便會以整數(shù)類型對后續(xù)的元素進行轉(zhuǎn)換,但是后面的一個元素是字符'a',無法將其轉(zhuǎn)為int,因此就會報上述error;arr2中,第一個遇到的元素是2.0,為float,所以后面的元素都會被轉(zhuǎn)為float,因此輸出為array([ 2.,  3., nan]),其中都變成了float,要注意的是,由于np.nan本身就是一個浮點數(shù),因此這里可以正確的轉(zhuǎn)換,轉(zhuǎn)換之后還是np.nan;但是看arr2,由于第一個遇到的元素類型為int32,后面的np.nan為float64,會造成溢出,這樣便無法正確的轉(zhuǎn)換,從而會用int32最接近np.nan的值去替換,所以就是-2**31==-2147483648,這里之所以是2**31,而不是2**32-1,是因為這里的int是signed int,即有正負號的int,所以其范圍是-2**31~2**31-1;而Decimal('5')被轉(zhuǎn)為了int 5,所以就出現(xiàn)了上述的結(jié)果。

 所以,當要被轉(zhuǎn)成ndarray的原始數(shù)據(jù)中有np.nan時,要特別注意這一點,最好是指定float類型,注意其他數(shù)據(jù)的兼容;而如果同時又是obejct數(shù)據(jù)類型時,那么同時也要注意第一個inner loop遇到的元素的數(shù)據(jù)類型,注意和后面的數(shù)據(jù)類型保持兼容。

小結(jié):numpy的dtype有諸多陷進,需要小心對待,謹慎核查,然后靈活運用。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論