在Numpy中,數組的每個元素都必須是相同的數據類型,這種“同構性”是Numpy高效處理數據的關鍵之一。而數據類型(dtype)則定義了數組中元素的存儲方式、佔用內存的大小以及支持的運算類型。掌握Numpy的數據類型(特別是dtype和astype方法),能幫助我們更靈活地處理數據,避免內存浪費和計算錯誤。
爲什麼數據類型很重要?¶
想象一下,如果我們有一個數組存儲溫度數據,假設溫度範圍在-20到50之間,用int64(64位整數)存儲顯然是浪費的,因爲int64能表示的範圍太大了。而如果用int8(8位整數,範圍-128到127)就足夠了,既能節省內存,又能滿足需求。因此,合理選擇數據類型是優化性能的第一步。
什麼是dtype?¶
dtype是Numpy中用於描述數組元素數據類型的對象,它決定了數組中元素的存儲格式和運算規則。每個Numpy數組都有一個dtype屬性,我們可以通過它查看數組的當前數據類型。
查看數組的dtype¶
創建一個簡單的數組,然後打印它的dtype:
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr.dtype) # 輸出: int64(根據系統和Numpy版本可能是int32,默認通常爲int64)
如果在創建數組時顯式指定數據類型:
arr_int32 = np.array([1, 2, 3, 4], dtype=np.int32)
print(arr_int32.dtype) # 輸出: int32
常用的數據類型¶
Numpy支持多種數據類型,以下是最常用的幾種:
| 數據類型 | 全稱 | 說明 |
|---|---|---|
np.int8 |
8位有符號整數 | 範圍: -128 ~ 127 |
np.int16 |
16位有符號整數 | 範圍: -32768 ~ 32767 |
np.int32 |
32位有符號整數 | 範圍: -2^31 ~ 2^31-1 |
np.int64 |
64位有符號整數 | 範圍: -2^63 ~ 2^63-1 |
np.uint8 |
8位無符號整數 | 範圍: 0 ~ 255 |
np.float32 |
32位浮點數 | 單精度,約7位有效數字 |
np.float64 |
64位浮點數(雙精度) | 約15位有效數字 |
np.bool_ |
布爾類型 | True/False |
np.object_ |
Python對象類型 | 可存儲任意類型 |
astype:數據類型轉換¶
astype方法用於將數組的數據類型轉換爲指定類型,返回一個新數組,原數組的數據類型不會改變。語法爲:數組.astype(目標數據類型)。
示例1:整數轉浮點數¶
arr = np.array([1, 2, 3, 4], dtype=np.int32)
float_arr = arr.astype(np.float64) # 轉換爲雙精度浮點數
print(float_arr) # 輸出: [1. 2. 3. 4.]
print(float_arr.dtype) # 輸出: float64
print(arr.dtype) # 輸出: int32(原數組未改變)
示例2:浮點數轉整數¶
arr = np.array([1.5, 2.9, 3.0, 4.1], dtype=np.float64)
int_arr = arr.astype(np.int32) # 轉換爲32位整數,小數部分被截斷
print(int_arr) # 輸出: [1 2 3 4]
注意:浮點數轉整數時,只會截斷小數部分(向下取整),不會四捨五入。例如
2.9會被轉爲2,而非3。
示例3:布爾類型轉換¶
Numpy中布爾值可以與整數互轉:
- 布爾轉整數:True → 1,False → 0
- 整數轉布爾:非0整數 → True,0 → False
# 布爾轉整數
bool_arr = np.array([True, False, True])
int_from_bool = bool_arr.astype(np.int32)
print(int_from_bool) # 輸出: [1 0 1]
# 整數轉布爾
int_arr = np.array([0, 1, 2, 3])
bool_from_int = int_arr.astype(np.bool_)
print(bool_from_int) # 輸出: [False True True True]
示例4:不同精度的整數轉換¶
# int64轉float32
arr = np.array([100, 200, 300], dtype=np.int64)
float_arr = arr.astype(np.float32)
print(float_arr) # 輸出: [100. 200. 300.]
print(float_arr.dtype) # 輸出: float32
# 大整數轉小整數(可能溢出)
arr = np.array([2**30, 2**30, 2**30], dtype=np.int64)
small_int_arr = arr.astype(np.int32) # int32最大約21億,此處數值較大會溢出
print(small_int_arr) # 輸出: [-1294967296 -1294967296 -1294967296](溢出結果)
警告:轉換爲更小的數據類型時可能導致溢出,需確保目標類型能容納原數據範圍。
總結¶
- dtype:用於查看和指定數組的數據類型,例如
arr.dtype查看類型,np.int32指定類型。 - astype:轉換數據類型,返回新數組,原數組不變。常用場景:統一數據類型、節省內存、適配運算需求。
- 注意事項:轉換時關注數據範圍(避免溢出)和精度損失(如浮點數轉整數)。
掌握這些基礎,你就能更靈活地處理Numpy數組的數據類型,爲後續的數據處理和分析打下堅實基礎!