人工智能之數據分析 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

五、注意事項與最佳實踐

  1. 避免不必要的 dtype 轉換​:頻繁 astype() 會降低性能。
  2. 內存效率​:使用合適精度的類型(如用 float32 代替 float64 可節省 50% 內存)。
  3. 整數溢出​:注意 int8 範圍是 -128~127,超出會迴繞(不報錯!)。
    x = np.array([127], dtype='int8')
    print(x + 1)  # [-128] ← 溢出!
    
  4. 默認 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》