寫在前面
—— 超越原生 Python 列表,解鎖高性能數值計算,深入理解 Pandas 的底層依賴
在前面一系列關于 Pandas 的學習中,我們已經領略了其在數據處理和分析方面的強大威力。我們學會了使用 DataFrame 和 Series 來高效地操作表格數據。但是,你是否好奇,Pandas 為何能夠如此高效地處理大規模數據?其背后隱藏著怎樣的 “秘密武器”?
答案就是我們今天要深入學習的主角——NumPy (Numerical Python)。
NumPy:Python 科學計算的基石
NumPy 是 Python 中用于 科學計算 的 基礎核心庫。它提供了:
- 一個強大的 N 維數組對象 (ndarray)。
- 用于操作這些數組的各種 高效函數 (例如數學運算、邏輯運算、形狀操作、排序、選擇等)。
- 用于線性代數、傅里葉變換和隨機數生成的工具。
為什么在學習 Pandas 之后還要學習 NumPy?
你可能會問,既然 Pandas 已經那么好用了,為什么我們還要回過頭來學習 NumPy? 原因主要有以下幾點:
- Pandas 的底層依賴: Pandas 的核心數據結構 Series 和 DataFrame 在底層很大程度上是建立在 NumPy 的 ndarray 之上的。理解 NumPy 的 ndarray 有助于我們更深入地理解 Pandas 的工作原理和性能特性。
- 高性能數值計算: NumPy 的 ndarray 專為 高性能的數值計算 而設計。相比于 Python 內置的列表 (list),ndarray 在存儲和處理大規模數值數據時具有顯著的優勢:
- 更少的內存占用: ndarray 存儲的是 同質數據類型 (所有元素類型相同),并且存儲方式更緊湊。
- 更快的計算速度: NumPy 的核心運算是用 C 語言 實現的,并且支持 向量化操作 (Vectorization),可以對整個數組進行批量操作,避免了 Python 層面低效的循環,速度遠超原生 Python 代碼。
- 科學計算生態系統的基礎: NumPy 是 Python 科學計算生態系統 (SciPy Stack) 的基石,許多其他重要的庫,如
SciPy
(科學計算庫)、Matplotlib
(可視化庫)、Scikit-learn
(機器學習庫) 等,都依賴于 NumPy。掌握 NumPy 是深入學習這些庫的前提。 - 直接應用場景: 在某些數據分析場景,特別是涉及大量 數值計算、矩陣運算、線性代數 等任務時,直接使用 NumPy 可能比 Pandas 更簡潔高效。
雖然本專欄將 NumPy 放在了 Pandas 之后講解 (因為對于初學者,直接上手 Pandas 更貼近數據分析的實際應用流程),但掌握 NumPy 的核心概念和操作,對于提升你的數據分析效率、深入理解 Pandas 以及為后續學習更高級的技術打下基礎,都至關重要。
本篇博客將帶你深入 NumPy 的世界,重點學習:
- NumPy 的核心數據結構:ndarray (N-維數組)
- 創建 ndarray 的多種方法
- ndarray 的重要屬性
- NumPy 的核心優勢:向量化運算 (UFuncs)
- ndarray 的索引與切片操作
- 布爾索引與條件篩選
掌握 NumPy,你將擁有更強大的數值計算能力,并能更深刻地理解你所使用的 Pandas 工具!
?? 一、NumPy 安裝與導入
與 Pandas 和 Matplotlib 類似,如果你使用 Anaconda,NumPy 通常已經預裝。 若未安裝,可使用 pip 或 conda 安裝:
pip install numpy
# 或者
conda install numpy
在 Python 腳本或 Jupyter Notebook 中,導入 NumPy 庫,并約定俗成地將其簡寫為 np
。
import numpy as np
?? 二、NumPy 的核心:ndarray 對象
NumPy 最核心的概念就是 ndarray (N-dimensional array),即 N 維數組。 它是一個 同質 (homogeneous) 數據類型的 多維網格。
ndarray 的關鍵特性:
- 維度 (Dimensions/Axes): ndarray 可以是一維、二維、三維甚至更高維度。 維度的數量稱為 秩 (rank)。
- 形狀 (Shape): 一個 元組 (tuple),描述了數組在 每個維度上的大小。 例如,一個 3 行 4 列的二維數組,其形狀為
(3, 4)
。 - 數據類型 (dtype): 數組中 所有元素的數據類型必須相同。 NumPy 支持多種數值數據類型,例如
int8
,int16
,int32
,int64
,uint8
(無符號整數),float16
,float32
,float64
,complex64
,complex128
,bool
,object
(可以存儲 Python 對象,但會失去 NumPy 的性能優勢),string_
,unicode_
等。 這與 Python 列表可以包含不同類型元素的特性形成對比。 - 固定大小 (Fixed Size): ndarray 在創建時大小是固定的。 改變數組的大小會創建一個新的數組并刪除原來的數組。 這有助于提高內存效率和計算性能。
1. 創建 ndarray
有多種方法可以創建 NumPy ndarray 對象:
-
從 Python 列表或元組創建:
np.array()
這是最常用的創建方式,可以將 Python 的列表或嵌套列表轉換為 ndarray。
# 創建一維數組 list1 = [1, 2, 3, 4, 5] arr1d = np.array(list1) print("一維數組 arr1d:\n", arr1d) print("arr1d 的類型:", type(arr1d)) print("arr1d 的數據類型:", arr1d.dtype)# 創建二維數組 (矩陣) list2d = [[1, 2, 3], [4, 5, 6]] arr2d = np.array(list2d) print("\n二維數組 arr2d:\n", arr2d) print("arr2d 的數據類型:", arr2d.dtype)# 創建指定數據類型的數組 arr_float = np.array([1, 2, 3], dtype=np.float64) # 指定為 float64 類型 print("\n指定數據類型的數組 arr_float:\n", arr_float) print("arr_float 的數據類型:", arr_float.dtype)arr_str = np.array([1, 2, 3], dtype=str) # 指定為字符串類型 print("\n指定數據類型的數組 arr_str:\n", arr_str) print("arr_str 的數據類型:", arr_str.dtype)
-
使用 NumPy 內置函數創建特定數組:
-
np.zeros(shape, dtype=float)
: 創建指定形狀shape
且所有元素都為 0 的數組。zeros_arr = np.zeros((2, 3)) # 創建一個 2x3 的全零浮點型數組 print("\n全零數組 zeros_arr:\n", zeros_arr)
-
np.ones(shape, dtype=float)
: 創建指定形狀shape
且所有元素都為 1 的數組。o
-