在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中布爾值可以與整數互轉:
- 布爾轉整數:True1False0
- 整數轉布爾:非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](溢出結果)

警告:轉換爲更小的數據類型時可能導致溢出,需確保目標類型能容納原數據範圍。

總結

  1. dtype:用於查看和指定數組的數據類型,例如arr.dtype查看類型,np.int32指定類型。
  2. astype:轉換數據類型,返回新數組,原數組不變。常用場景:統一數據類型、節省內存、適配運算需求。
  3. 注意事項:轉換時關注數據範圍(避免溢出)和精度損失(如浮點數轉整數)。

掌握這些基礎,你就能更靈活地處理Numpy數組的數據類型,爲後續的數據處理和分析打下堅實基礎!

小夜