numpy資料型別說明以及自動轉換陷阱

2021-09-29 15:35:14 字數 2373 閱讀 2154

numpy的dtype是乙個很重要的概念,因為numpy為了效能,優化了記憶體管理,ndarray的值在記憶體中幾乎是連續的,同時其每個元素的記憶體大小也被設計成是一樣的,因此,當生成ndarray時,每個元素的資料型別都會被轉為相同的型別,這時如果原生的資料型別是不一樣的,那麼就涉及到乙個資料型別轉換的問題,即data type casting。

明白numpy中的資料型別轉換可以有效的避免和理解很多的行為,因為numpy中很多的error往往都是有資料型別轉換引起的,所以理解numpy的資料型別轉換可以預防和排查很多的問題。首先,在numpy中有很多的資料型別,多於python內建資料型別,具體有哪些型別,可以參看下圖,下圖的columns和index是資料型別在numpy中的符號,具體的釋義可以檢視這裡。下面,我們重點講一下numpy中關於資料型別以及轉換中容易碰到的陷進或者需要注意的點。

在numpy中,乙個資料型別實際上是乙個dtype物件,其有一些重要的屬性,比如位元組順序、資料型別、位元組數大小等,一般的,numpy中的資料型別會表示成類似'在構造ndarray時,可以指定dtype引數來設定ndarray裡面元素的資料型別,這個dtype可以用'i4'這樣的表示方式,也可以用int表示,但是後者沒法指定位元組數。要注意的是,指定dtype時,一定要確認這個dtype可以相容所有元素,防止溢位或者不相容,對此我們可以通過result_type(*array_like)來判斷我們應該設定的dtype,這個函式返回的dtype是可以相容所有元素的最小size的資料型別;或者我們無需設定,其會自動進行資料型別的轉換,我們也可以通過ndarray.dtype屬性檢視資料型別。anyway,我們要有這種資料型別轉換的意識,因為這會影響後續對ndarray的操作。

numpy的資料型別之間能夠實現轉換,可以通過np.can_cast(fromtype,totype)這個函式來判斷,更詳細的可以檢視下圖。

當numpy中有python獨有的原生資料型別,比如decimal,那麼ndarray會被轉為object資料型別,表示python物件資料型別,當然這裡也可以轉為字串,但是字串對於np.nan往往會佔據更大的itemsize。

當numpy函式對dtype位object的ndarray處理時,會先把裡面的元素再進一步轉為其他numpy的資料型別,這樣才可以操作,所以這裡如果函式沒法或沒有指定型別引數,那麼會預設以第乙個inner loop到的資料型別作為所有元素的型別,並以此型別進行後續轉換,這時,對於object型別的ndarray來說,往往容易出現資料無法轉換成功的異常。所以要注意處理時第乙個inner loop遇到的元素的型別是否可以相容後面要處理的所有元素,不然會丟擲異常。看下面的例子說明。

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

# output:

# valueerror: invalid literal for int() with base 10: 'a'

arr2

# output:

# array([ 2., 3., nan])

arr2

# output:

# array([ 3, -2147483648, 5])

從上面的例子中可以看到,arr1中,由於第乙個inner loop遇到的元素是整數1,所以便會以整數型別對後續的元素進行轉換,但是後面的乙個元素是字元'a',無法將其轉為int,因此就會報上述error;arr2中,第乙個遇到的元素是2.0,為float,所以後面的元素都會被轉為float,因此輸出為array([ 2.,  3., nan]),其中都變成了float,要注意的是,由於np.nan本身就是乙個浮點數,因此這裡可以正確的轉換,轉換之後還是np.nan;但是看arr2,由於第乙個遇到的元素型別為int32,後面的np.nan為float64,會造成溢位,這樣便無法正確的轉換,從而會用int32最接近np.nan的值去替換,所以就是-2**31==-2147483648,這裡之所以是2**31,而不是2**32-1,是因為這裡的int是signed int,即有正負號的int,所以其範圍是-2**31~2**31-1;而decimal('5')被轉為了int 5,所以就出現了上述的結果。

所以,當要被轉成ndarray的原始資料中有np.nan時,要特別注意這一點,最好是指定float型別,注意其他資料的相容;而如果同時又是obejct資料型別時,那麼同時也要注意第乙個inner loop遇到的元素的資料型別,注意和後面的資料型別保持相容。

numpy的dtype有諸多陷進,需要小心對待,謹慎核查,然後靈活運用。

NumPy 資料型別

numpy 支援比 python 更多種類的數值型別。下表顯示了 numpy 中定義的不同標量資料型別。序號資料型別及描述 1.bool 儲存為乙個位元組的布林值 真或假 2.int 預設整數,相當於 c 的long,通常為int32或int64 3.intc相當於 c 的int,通常為int32或...

NumPy 資料型別

numpy提供的數值型別,數值範圍比python提供的數值型別更大。numpy的數值型別,如下表所示 sn資料型別描述1 bool 布林值,取值ture false,占用乙個位元組 2int 是integer的預設型別。與c語言中的long型別相同,有可能是64位或32位。3intc 類似於c語言中...

Numpy資料型別

numpy是python的一種開源的數值計算擴充套件,是一些針對矩陣進行運算的模組。1.numpy介紹 2.numpy 學習筆記 3.python中的list和array的不同之處 4.python列表 numpy陣列與矩陣的區別 1.python中的list和np.array的不同之處 numpy...