
- NumPy 教程
- NumPy - 首頁
- NumPy - 簡介
- NumPy - 環境
- NumPy 陣列
- NumPy - ndarray 物件
- NumPy 資料型別
- NumPy 建立和運算元組
- NumPy - 陣列建立例程
- NumPy - 陣列操作
- NumPy - 從現有資料建立陣列
- NumPy - 從數值範圍建立陣列
- NumPy - 迭代陣列
- NumPy - 重塑陣列
- NumPy - 連線陣列
- NumPy - 堆疊陣列
- NumPy - 分割陣列
- NumPy - 展平陣列
- NumPy - 轉置陣列
- NumPy 索引和切片
- NumPy - 索引與切片
- NumPy - 高階索引
- NumPy 陣列屬性和操作
- NumPy - 陣列屬性
- NumPy - 陣列形狀
- NumPy - 陣列大小
- NumPy - 陣列步幅
- NumPy - 陣列元素大小
- NumPy - 廣播
- NumPy - 算術運算
- NumPy - 陣列加法
- NumPy - 陣列減法
- NumPy - 陣列乘法
- NumPy - 陣列除法
- NumPy 高階陣列操作
- NumPy - 交換陣列軸
- NumPy - 位元組交換
- NumPy - 副本與檢視
- NumPy - 元素級的陣列比較
- NumPy - 陣列過濾
- NumPy - 連線陣列
- NumPy - 排序、搜尋與計數函式
- NumPy - 搜尋陣列
- NumPy - 陣列的並集
- NumPy - 查詢唯一行
- NumPy - 建立日期時間陣列
- NumPy - 二元運算子
- NumPy - 字串函式
- NumPy - 數學函式
- NumPy - 統計函式
- NumPy - 矩陣庫
- NumPy - 線性代數
- NumPy - Matplotlib
- NumPy - 使用 Matplotlib 繪製直方圖
- NumPy - NumPy 的 I/O 操作
- NumPy 排序和高階操作
- NumPy - 陣列排序
- NumPy - 沿軸排序
- NumPy - 使用花式索引排序
- NumPy - 結構化陣列
- NumPy - 建立結構化陣列
- NumPy - 操作結構化陣列
- NumPy - 欄位訪問
- NumPy - 記錄陣列
- NumPy - 載入陣列
- NumPy - 儲存陣列
- NumPy - 向陣列追加值
- NumPy - 交換陣列的列
- NumPy - 向陣列插入軸
- NumPy 處理缺失資料
- NumPy - 處理缺失資料
- NumPy - 識別缺失值
- NumPy - 刪除缺失資料
- NumPy - 填充缺失資料
- NumPy 效能最佳化
- NumPy - 使用陣列進行效能最佳化
- NumPy - 使用陣列進行向量化
- NumPy - 陣列的記憶體佈局
- NumPy 線性代數
- NumPy - 線性代數
- NumPy - 矩陣庫
- NumPy - 矩陣加法
- NumPy - 矩陣減法
- NumPy - 矩陣乘法
- NumPy - 元素級的矩陣運算
- NumPy - 點積
- NumPy - 矩陣求逆
- NumPy - 行列式計算
- NumPy - 特徵值
- NumPy - 特徵向量
- NumPy - 奇異值分解
- NumPy - 求解線性方程
- NumPy - 矩陣範數
- NumPy 元素級矩陣運算
- NumPy - 求和
- NumPy - 平均值
- NumPy - 中位數
- NumPy - 最小值
- NumPy - 最大值
- NumPy 集合運算
- NumPy - 唯一元素
- NumPy - 交集
- NumPy - 並集
- NumPy - 差集
- NumPy 有用資源
- NumPy 編譯器
- NumPy - 快速指南
- NumPy - 有用資源
- NumPy - 討論
NumPy 資料型別
NumPy 資料型別
NumPy 支援比 Python 更多樣的數值型別。下表顯示了 NumPy 中定義的不同標量資料型別。
序號 | 資料型別及描述 |
---|---|
1 | bool_ 布林值 (True 或 False),儲存為一個位元組 |
2 | int_ 預設整數型別 (與 C 語言的 long 相同;通常為 int64 或 int32) |
3 | intc 與 C 語言的 int 相同 (通常為 int32 或 int64) |
4 | intp 用於索引的整數 (與 C 語言的 ssize_t 相同;通常為 int32 或 int64) |
5 | int8 位元組 (-128 到 127) |
6 | int16 整數 (-32768 到 32767) |
7 | int32 整數 (-2147483648 到 2147483647) |
8 | int64 整數 (-9223372036854775808 到 9223372036854775807) |
9 | uint8 無符號整數 (0 到 255) |
10 | uint16 無符號整數 (0 到 65535) |
11 | uint32 無符號整數 (0 到 4294967295) |
12 | uint64 無符號整數 (0 到 18446744073709551615) |
13 | float_ float64 的簡寫 |
14 | float16 半精度浮點數:符號位,5 位指數,10 位尾數 |
15 | float32 單精度浮點數:符號位,8 位指數,23 位尾數 |
16 | float64 雙精度浮點數:符號位,11 位指數,52 位尾數 |
17 | complex_ complex128 的簡寫 |
18 | complex64 複數,由兩個 32 位浮點數表示(實部和虛部) |
19 | complex128 複數,由兩個 64 位浮點數表示(實部和虛部) |
NumPy 數值型別是 dtype(資料型別)物件的例項,每個物件都有其獨特的特性。這些 dtype 可作為 np.bool_、np.float32 等使用。
資料型別物件 (dtype)
資料型別物件描述了對應於陣列的固定記憶體塊的解釋,取決於以下幾個方面:
資料型別 (整數、浮點數或 Python 物件)
資料大小
位元組序 (小端序或大端序)
對於結構化型別,欄位名稱、每個欄位的資料型別以及每個欄位佔用的記憶體塊部分。
如果資料型別是子陣列,則其形狀和資料型別。
位元組序由在資料型別前新增“<”或“>”來決定。“<”表示編碼是小端序(最低有效位儲存在最小地址)。“>”表示編碼是大端序(最高有效位儲存在最小地址)。
dtype 物件使用以下語法構造:
numpy.dtype(object, align, copy)
引數如下:
物件 - 要轉換為資料型別物件的。
Align - 如果為 True,則向欄位新增填充,使其類似於 C 結構體。
Copy - 建立 dtype 物件的新副本。如果為 False,則結果是對內建資料型別物件的引用。
示例:使用陣列標量型別
import numpy as np dt = np.dtype(np.int32) print(dt)
以下是獲得的輸出:
int32
示例:使用資料型別的等效字串
import numpy as np dt = np.dtype('i4') print(dt)
這將產生以下結果:
int32
示例:使用位元組序表示法
import numpy as np dt = np.dtype('>i4') print(dt)
以下是上述程式碼的輸出:
>i4
示例:建立結構化資料型別
以下示例顯示了結構化資料型別的用法。這裡,需要宣告欄位名和對應的標量資料型別:
import numpy as np dt = np.dtype([('age', np.int8)]) print(dt)
獲得的輸出如下所示:
[('age', 'i1')]
示例:將結構化資料型別應用於 ndarray
import numpy as np dt = np.dtype([('age', np.int8)]) a = np.array([(10,), (20,), (30,)], dtype=dt) print(a)
執行上述程式碼後,我們得到以下輸出:
[(10,) (20,) (30,)]
示例:訪問結構化資料型別的欄位內容
import numpy as np dt = np.dtype([('age', np.int8)]) a = np.array([(10,), (20,), (30,)], dtype=dt) print(a['age'])
產生的結果如下:
[10 20 30]
示例:定義複雜的結構化資料型別
以下示例定義了一個名為 student 的結構化資料型別,其中包含一個字串欄位 'name'、一個 整數字段 'age' 和一個 浮點欄位 'marks'。此 dtype 應用於 ndarray 物件:
import numpy as np student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')]) print(student)
我們得到如下所示的輸出:
[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')])
示例:將複雜的結構化資料型別應用於 ndarray
import numpy as np student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')]) a = np.array([('abc', 21, 50), ('xyz', 18, 75)], dtype=student) print(a)
輸出如下:
[('abc', 21, 50.0), ('xyz', 18, 75.0)]
每個內建資料型別都有一個字元程式碼來唯一標識它。
'b' - 布林值
'i' - (帶符號) 整數
'u' - 無符號整數
'f' - 浮點數
'c' - 復浮點數
'm' - timedelta
'M' - datetime
'O' - (Python) 物件
'S', 'a' - (位元組) 字串
'U' - Unicode
'V' - 原始資料 (void)
檢查陣列的資料型別
可以使用 dtype 屬性檢查陣列的資料型別。此屬性返回一個 dtype 物件,該物件描述了陣列中元素的型別,如下所示:
import numpy as np a = np.array([1, 2, 3]) print(a.dtype)
以下是獲得的輸出:
int64
建立具有已定義資料型別的陣列
在 NumPy 中,可以在建立陣列時顯式指定元素的資料型別 (dtype)。
我們可以在陣列建立函式(例如 np.array()、np.zeros()、np.ones() 等)中使用 dtype 引數來定義陣列元素的資料型別。預設情況下,NumPy 會從輸入資料中推斷資料型別。
示例:建立整數陣列
在這個示例中,我們建立了一個名為 a 的陣列,其元素型別為 int32,這意味著每個元素都是一個 32 位整數:
import numpy as np # Creating an array of integers with a specified dtype a = np.array([1, 2, 3], dtype=np.int32) print("Array:", a) print("Data type:", a.dtype)
這將產生以下結果:
Array: [1 2 3] Data type: int32
示例:建立整數陣列
這裡,我們建立了一個名為 c 的陣列,其元素型別為 complex64,表示 64 位複數(32 位實部和 32 位虛部):
import numpy as np # Creating an array of complex numbers with a specified dtype c = np.array([1+2j, 3+4j, 5+6j], dtype=np.complex64) print("Array:", c) print("Data type:", c.dtype)
以下是上述程式碼的輸出:
Array: [1.+2.j 3.+4.j 5.+6.j]Data type: complex64
轉換 NumPy 陣列的資料型別
NumPy 提供了幾種方法來轉換陣列的資料型別,允許您更改資料儲存和處理方式,而無需修改底層值:
astype() 方法 - 這是最常用的型別轉換方法。
numpy.cast() 函式 - NumPy 提供的一組用於將陣列轉換為不同型別的函式。
就地型別轉換 - 在建立陣列時直接轉換型別。
示例:使用 "astype" 方法
astype 方法建立陣列的副本,並將其轉換為指定的型別。這是更改陣列資料型別的最常用方法。
這裡,我們使用 NumPy 中的 astype() 方法將整數陣列轉換為浮點資料型別:
import numpy as np # Creating an array of integers a = np.array([1, 2, 3, 4, 5]) print("Original array:", a) print("Original dtype:", a.dtype) # Converting to float a_float = a.astype(np.float32) print("Converted array:", a_float) print("Converted dtype:", a_float.dtype)
獲得的輸出如下所示:
Original array: [1 2 3 4 5] Original dtype: int64 Converted array: [1. 2. 3. 4. 5.] Converted dtype: float32
示例:使用 "numpy.cast" 函式
NumPy 還提供用於將陣列轉換為特定型別的函式。這些函式不太常用,但在某些情況下可能很有用。
在這個示例中,我們建立一個浮點數陣列,並使用 numpy.int32() 函式將其轉換為整數:
import numpy as np # Creating an array of floats d = np.array([1.1, 2.2, 3.3, 4.4, 5.5]) print("Original array:", d) print("Original dtype:", d.dtype) # Converting to integer using numpy.int32 d_int = np.int32(d) print("Converted array:", d_int) print("Converted dtype:", d_int.dtype)
執行上述程式碼後,我們得到以下輸出:
Original array: [1.1 2.2 3.3 4.4 5.5] Original dtype: float64 Converted array: [1 2 3 4 5] Converted dtype: int32
示例:就地型別轉換
您還可以在建立陣列時指定資料型別,以避免以後需要轉換型別。
現在,我們使用 numpy.float32() 函式指定浮點資料型別來建立一個整數陣列:
import numpy as np # Creating an array of integers with a specified dtype e = np.array([1, 2, 3, 4, 5], dtype=np.float32) print("Array:", e) print("Data type:", e.dtype)
產生的結果如下:
Array: [1. 2. 3. 4. 5.] Data type: float32
如果值無法轉換怎麼辦?
在 NumPy 中轉換資料型別時,可能會遇到無法轉換為所需型別的值。這種情況通常會引發錯誤或導致意外行為。
讓我們探討無法轉換值的不同場景以及如何處理它們:
場景 1:將非數字字串轉換為數字
如果嘗試將非數字字串轉換為整數或浮點數,NumPy 將引發 ValueError,如下所示:
import numpy as np # Creating an array with non-numeric strings a = np.array(['1', '2', 'three', '4', '5']) print("Original array:", a) print("Original dtype:", a.dtype) try: # Attempting to convert to integer a_int = a.astype(np.int32) print("Converted array:", a_int) print("Converted dtype:", a_int.dtype) except ValueError as e: print("Error:", e)
在這種情況下,字串“three”無法轉換為整數,導致出現 ValueError,如下所示:
Original array: ['1' '2' 'three' '4' '5'] Original dtype: <U5 Error: invalid literal for int() with base 10: 'three'
場景 2:轉換超出範圍的數字
如果嘗試轉換對於目標資料型別而言超出範圍的數字,NumPy 將引發 OverflowError:
import numpy as np # Creating an array with large float values b = np.array([1.1e10, 2.2e10, 3.3e10]) print("Original array:", b) print("Original dtype:", b.dtype) try: # Attempting to convert to integer b_int = b.astype(np.int32) print("Converted array:", b_int) print("Converted dtype:", b_int.dtype) except OverflowError as e: print("Error:", e)
這裡,較大的浮點值無法轉換為 int32 而不會溢位:
Original array: [1.1e+10 2.2e+10 3.3e+10] Original dtype: float64 Error: OverflowError: (34, 'Numerical result out of range')
場景 3:將複數轉換為實數
將複數轉換為實數時,NumPy 會丟棄虛部並引發 ComplexWarning:
import numpy as np # Creating an array with complex numbers c = np.array([1+2j, 3+4j, 5+6j]) print("Original array:", c) print("Original dtype:", c.dtype) # Converting to float, discarding imaginary part c_float = c.astype(np.float32) print("Converted array:", c_float) print("Converted dtype:", c_float.dtype)
在這種情況下,NumPy 會引發 ComplexWarning 並丟棄轉換過程中的虛部:
Original array: [1.+2.j 3.+4.j 5.+6.j] Original dtype: complex128 ComplexWarning: Casting complex values to real discards the imaginary partc_float = c.astype(np.float32) Converted array: [1. 3. 5.] Converted dtype: float32
場景 4:處理轉換錯誤
要處理轉換錯誤,可以使用 try-except 塊之類的錯誤處理技術來捕獲和處理異常。
import numpy as np # Creating an array with mixed data d = np.array(['1', '2', 'three', '4', '5']) print("Original array:", d) print("Original dtype:", d.dtype) def safe_convert(arr, target_type): try: return arr.astype(target_type) except ValueError as e: print("Conversion error:", e) return None # Attempting to convert to integer d_int = safe_convert(d, np.int32) if d_int is not None: print("Converted array:", d_int) print("Converted dtype:", d_int.dtype) else: print("Conversion failed.")
在這個示例中,safe_convert() 函式捕獲“ValueError”並透過返回 None 和列印錯誤訊息來處理它,如下所示:
Original array: ['1' '2' 'three' '4' '5'] Original dtype: <U5 Conversion error: invalid literal for int() with base 10: 'three' Conversion failed.
場景 5:對無效轉換使用 "np.nan"
對於數值轉換,可以使用 np.nan(非數字)來處理無效值。這種方法在處理缺失資料或損壞資料時很有用。
import numpy as np # Creating an array with strings, including an invalid entry e = np.array(['1.1', '2.2', 'three', '4.4', '5.5']) print("Original array:", e) print("Original dtype:", e.dtype) def convert_with_nan(arr): result = [] for item in arr: try: result.append(float(item)) except ValueError: result.append(np.nan) return np.array(result) # Converting to float with np.nan for invalid entries e_float = convert_with_nan(e) print("Converted array:", e_float) print("Converted dtype:", e_float.dtype)
此處,無效條目將被替換為 np.nan −
Original array: ['1.1' '2.2' 'three' '4.4' '5.5'] Original dtype: <U5 Converted array: [1.1 2.2 nan 4.4 5.5] Converted dtype: float64
現有陣列的資料型別轉換
您還可以使用view()方法轉換現有陣列的資料型別,以更改資料的解釋方式,而無需更改底層位元組。
示例
此處,資料被重新解釋為“float32”,由於底層位元組保持不變,因此導致了意外的值−
import numpy as np # Creating an array of integers g = np.array([1, 2, 3, 4], dtype=np.int32) print("Original array:", g) print("Original dtype:", g.dtype) # Viewing the array as float32 g_view = g.view(np.float32) print("Viewed array:", g_view) print("Viewed dtype:", g_view.dtype)
以下是上述程式碼的輸出:
Original array: [1 2 3 4] Original dtype: int32 Viewed array: [1.4012985e-45 2.8025969e-45 4.2038954e-45 5.6051939e-45] Viewed dtype: float32