人工智能之數據分析 numpy
第四章 數組屬性和數據類型
(文章目錄)
前言
NumPy 的 ndarray(N 維數組) 不僅是一個高效的多維容器,還具有豐富的屬性和靈活的數據類型(dtype)系統。理解這些內容對於高效使用 NumPy 至關重要。
一、NumPy 數組的核心屬性
創建一個示例數組:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)
1. ndim:數組的維度數(軸的數量)
print(arr.ndim) # 輸出:2
2. shape:數組在每個維度上的大小(元組)
print(arr.shape) # 輸出:(2, 3) → 2行3列
3. size:數組中元素的總個數
print(arr.size) # 輸出:6(= 2 × 3)
4. dtype:數組元素的數據類型
print(arr.dtype) # 輸出:float32
5. itemsize:每個元素佔用的字節數
print(arr.itemsize) # 輸出:4(因為 float32 佔 4 字節)
6. nbytes:整個數組佔用的總字節數(= size × itemsize)
print(arr.nbytes) # 輸出:24(6 × 4)
7. data:底層數據的內存地址(一般不直接使用)
print(arr.data) # <memory at 0x...>
⚠️ 注意:
data屬性返回的是緩衝區對象,不是實際數據內容。要訪問數據,請直接使用數組本身。
二、NumPy 數據類型(dtype)
NumPy 支持比 Python 原生更豐富、更精確的數值類型,尤其適合科學計算。
1. 常見 dtype 類型
| 類型名 | 描述 | 對應 C 類型 | 示例 |
|---|---|---|---|
bool_ |
布爾值(True/False) | bool | np.bool_ |
int8,int16,int32,int64 |
有符號整數 | char, short, int, long long | np.int32 |
uint8,uint16,uint32,uint64 |
無符號整數 | unsigned char 等 | np.uint8 |
float16,float32,float64 |
浮點數 | half, float, double | np.float64(默認) |
complex64,complex128 |
複數 | float + float i, double + double i | np.complex128 |
💡 在大多數系統上:
np.int_≡np.int64(64 位系統)np.float_≡np.float64
2. 指定 dtype 創建數組
a = np.array([1, 2, 3], dtype='int32')
b = np.zeros(5, dtype=np.float64)
c = np.array([1.5, 2.7], dtype=np.float32)
3. 查看和修改 dtype
- 查看:
print(a.dtype) # int32 - **轉換(返回新數組)**:
d = a.astype(np.float64) print(d.dtype) # float64
⚠️
astype()會創建副本,除非 dtype 相同。
4. 自定義結構化 dtype(用於記錄型數據)
適用於類似表格或結構體的數據:
dt = np.dtype([('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
people = np.array([('Alice', 25, 55.5), ('Bob', 30, 70.0)], dtype=dt)
print(people['name']) # ['Alice' 'Bob']
print(people[0]['age']) # 25
'U10'表示 Unicode 字符串,最多 10 個字符'i4'表示 4 字節整數(即 int32)'f4'表示 4 字節浮點數(float32)
三、數據類型字符串表示(簡寫)
NumPy 允許使用字符串簡寫指定 dtype:
| 字符串 | 含義 |
|---|---|
'i4' |
32 位整數 |
'f8' |
64 位浮點數 |
'U10' |
最大長度為 10 的 Unicode 字符串 |
'bool' |
布爾值 |
'c8' |
64 位複數(兩個 32 位浮點) |
示例:
x = np.array([1, 2], dtype='f4') # 等價於 np.float32
四、dtype 的屬性(瞭解即可)
t = np.dtype('float64')
print(t.name) # 'float64'
print(t.itemsize) # 8
print(t.kind) # 'f'(f=float, i=int, U=unicode string, b=bool 等)
常見 kind 值:
'b': boolean'i': signed integer'u': unsigned integer'f': floating-point'c': complex floating-point'U': Unicode string'O': Python object
五、注意事項與最佳實踐
- 避免不必要的 dtype 轉換:頻繁
astype()會降低性能。 - 內存效率:使用合適精度的類型(如用
float32代替float64可節省 50% 內存)。 - 整數溢出:注意
int8範圍是 -128~127,超出會迴繞(不報錯!)。x = np.array([127], dtype='int8') print(x + 1) # [-128] ← 溢出! - 默認 dtype:
- 整數列表 →
int64(64 位系統) - 浮點列表 →
float64 - 混合(如
[1, 2.0])→float64
- 整數列表 →
六、小結表:常用屬性與 dtype 對照
| 屬性/操作 | 説明 |
|---|---|
arr.ndim |
維度數量 |
arr.shape |
各維度大小 |
arr.size |
元素總數 |
arr.dtype |
數據類型 |
arr.itemsize |
單個元素字節數 |
arr.astype(new_dtype) |
類型轉換 |
np.dtype([...]) |
自定義結構化類型 |
在處理圖像(常用 uint8)、深度學習(常用 float32)或金融數據(需高精度 float64),選擇合適的 dtype 能顯著提升性能和內存效率。
後續
部分代碼已經上傳至gitee,後續會逐步更新,主要受時間原因限制,當然自己也可以克隆到本地學習拓展。
資料關注
公眾號:咚咚王 gitee:https://gitee.com/wy18585051844/ai_learning
《Python編程:從入門到實踐》 《利用Python進行數據分析》 《算法導論中文第三版》 《概率論與數理統計(第四版) (盛驟) 》 《程序員的數學》 《線性代數應該這樣學第3版》 《微積分和數學分析引論》 《(西瓜書)周志華-機器學習》 《TensorFlow機器學習實戰指南》 《Sklearn與TensorFlow機器學習實用指南》 《模式識別(第四版)》 《深度學習 deep learning》伊恩·古德費洛著 花書 《Python深度學習第二版(中文版)【純文本】 (登封大數據 (Francois Choliet)) (Z-Library)》 《深入淺出神經網絡與深度學習+(邁克爾·尼爾森(Michael+Nielsen)》 《自然語言處理綜論 第2版》 《Natural-Language-Processing-with-PyTorch》 《計算機視覺-算法與應用(中文版)》 《Learning OpenCV 4》 《AIGC:智能創作時代》杜雨+&+張孜銘 《AIGC原理與實踐:零基礎學大語言模型、擴散模型和多模態模型》 《從零構建大語言模型(中文版)》 《實戰AI大模型》 《AI 3.0》