亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Numpy 數據類型

本小節將詳述 Numpy 內置的數據類型,以及如何在創建數組對象時進行靈活指定、如何查看創建好的數組類型、以及如何更改數據類型。

1. 常見數據類型

Numpy 支持的數據類型比 Python 內置的要多很多,而這也是 Numpy 如此靈活和強大的原因之一。

例如對于整數,在 Numpy 中,根據整數的位數不同所需要占據的空間大小不同,又對整數類型進行類細分,常見地可以分為 int8、int16、int32、int64 等等。

Numpy 支持的常用數據類型如下:

類型 說明
int8、uint8 分別表示有符號和無符號的8位整型,可表示的整數范圍為-128 ~ 127、0 ~ 255
int16、uint16 分別表示有符號和無符號的16位整型,可表示的整數范圍為-32768 ~ 32767、0 ~ 65535
int32、uint32 分別表示有符號和無符號的32位整型,可表示的整數范圍為-2147483648 ~ 2147483647、0 ~ 4294967295
int64、uint64 分別表示有符號和無符號的64位整型,可表示的整數范圍為-9223372036854775808 ~ 9223372036854775807、0 ~ 18446744073709551615
float16、float32、float64、float128 分別表示半精度浮點數、單精度浮點、雙精度浮點、擴展精度浮點數
complex64、complex128、complex256 分別用兩個32位、64位、128位的浮點數表示的復數
bool 存儲True和False值的布爾類型
Object Python對象類型
string_ 類型代號S,固定長度的字符串類型,每個字符1個字節。例如,如果需要創建一個長度為10的字符串,應使用S10。
unicode_ 類型代號U,固定長度的unicode類型,跟字符串的定義方式一樣,例如(U8

2. 定義數據類型

dtype 是一個特殊的對象,在該對象中定義了 ndarray 的數據類型與數據大小。通常我們在創建 ndarray 的時候,可以顯示地利用 dtype 定義數組的細節信息。

案例

在創建數組對象的時候,通過給 dtype 賦值,顯式地定義一個 int8 類型的數組。

import numpy as np

arr0 = np.array([[1,2,3], [4,5,6]], dtype=np.int8)
arr0
Out:
    array([[1, 2, 3],
            [4, 5, 6]], dtype=int8)

在創建數組對象的時候,通過給 dtype 賦值,顯式地定義一個 float16 類型的數組

arr1 = np.array([[1.2, -2.4, 3.1], [-4, 5.9, -6.7]], dtype=np.float16)
arr1
Out:
    array([[ 1.2, -2.4,  3.1],
		[-4. ,  5.9, -6.7]], dtype=float16)

在創建數組對象的時候,通過給 dtype 賦值,顯式地定義一個 S2 字符串類型的數組

arr2 = np.array(list('ABCD'), ndmin=2, dtype='S2')
arr2
Out:
    array([[b'A', b'B', b'C', b'D']], dtype='|S2')

在創建數組對象的時候,通過給 dtype 賦值,顯式地定義布爾類型的數組

arr3 = np.array([[-1,0,-3], [4,-5,6]], dtype=np.bool)
arr3
Out:
    array([[ True, False,  True],
           [ True,  True,  True]])

3. 查詢數據類型

同樣的,對于已經定義好數組,也可以通過調用 dtype 對象,查看其數據類型。

案例

逐個查看上面定義的數組的數據類型:

arr0.dtype
Out:
    dtype('int8')
arr1.dtype
Out:
    dtype('float16')
arr2.dtype
Out:
    dtype('S2')
arr3.dtype
Out:
    dtype('bool')

4. 更改數據類型

對于已經定義好的數組,也可以通過 ndarray 的 astype 方法對 dtype 對象進行修改。

案例

將整數類型的數組轉換成浮點數類型,并查看轉換之后的結果:

float_arr0 = arr0.astype(np.float)
float_arr0.dtype
Out:
    dtype('float64')

可以看到,在我們不指定具體的浮點數精度的時候,Numpy 也會自動去推斷一個合理的類型(當然,很多時候并不是最優的類型,因此在處理大數據集時,建議定義完整)。

如果把浮點數轉換成整數,則小數部分將會被截斷舍棄。

int_arr1 = arr1.astype(np.int8)
int_arr1
array([[ 1, -2,  3],
       [-4,  5, -6]], dtype=int8)

對于字符串類型的數組,在某些情況是可以與浮點數進行轉換的,例如:

string_arr4 = np.array([['1.2', '2.8'], ['4.3', '5.7']], dtype=np.string_)
string_arr4.astype(np.float16)
Out:
    array([[1.2, 2.8],
           [4.3, 5.7]], dtype=float16)

需要注意的是,astype 并非全能,在某些情況下,如果轉換過程失敗,則會引發一個ValueError。例如:

string_arr4.astype(np.int16)
ValueError                                Traceback (most recent call last)
<ipython-input-25-787558dcde3c> in <module>
----> 1 string_arr4.astype(np.int16)

ValueError: invalid literal for int() with base 10: '1.2'

通過觀察上面的案例,我們會發現,利用 astype 方法會創造出一個新的數組。確實 astype 方法并不能在原有的數組上進行修改,因此如果你想保存改變后的數組,務必記得給它賦個值。

5. 小結

本小節詳細講述了 Numpy 內置的數據類型,以及如何定義、查詢、更改數組的數據類型。需要注意的是,在利用 astype 方法更改數據類型的時候,并不是 100% 成功的。