NumPy:Python 數據科學中的強大工具

作者: Calpa Liu
字數:1367
出版:2025年3月30日
分類: 後端開發 Python Data ScienceMachine LearningNumPy

NumPy(Numerical Python)作為 Python 中最受歡迎的數值計算庫,為數據科學家和工程師提供了處理大型數據集的強大工具。與 Python 原生列表相比,NumPy 提供了顯著的性能提升和更便捷的數據操作方式。本文將深入探討 NumPy 的優勢,並通過實例展示其在數據處理中的應用。

NumPy 簡介

NumPy 的核心是 ndarray 對象,這是一種與 Python 列表類似但具有顯著優勢的多維數組結構。與標準 Python 列表不同,NumPy 數組:

  • 以原始數據類型存儲數值(直接以字節形式)
  • 支持多維結構
  • 具有固定大小
  • 提供高效的數值計算功能

NumPy 使用 Python 和 C 語言開發,是一個跨平台的開源庫,主要用於數值分析和科學計算。

NumPy 的主要優勢

內存效率

NumPy 在內存使用方面遠優於 Python 列表。以一個簡單的數字列表為例:

k = [1, 2, 3, 4]  # Python 列表

在 Python 中,這個列表中的每個整數對象通常佔用約 28 字節,加上每個元素的指針(通常 8 字節),總計需要 144 字節的存儲空間。而 NumPy 將這些數據作為連續的原始字節存儲,大大節省了內存空間。

NumPy 的內存效率主要源於其使用更少的存儲空間和更加緊湊的數據結構,這是其最主要的優勢之一。

執行速度

NumPy 的操作速度明顯快於 Python 標準列表,特別是在處理大型數據集時:

  • NumPy 的函數在 C 語言中實現,處理原始數據類型的數組非常快
  • 批量操作數據比 Python 逐個處理元素快 10-100 倍
  • 在計算密集型任務中(如機器學習),NumPy 的性能優勢尤為明顯

由於 NumPy 將大部分計算工作交給優化過的 C 代碼處理,Python 代碼只需負責設置並告訴它做什麼,這使得即使是高度動態且相對緩慢的 Python 語言也能在數值計算方面與底層語言競爭。

高級數組操作

NumPy 提供了豐富的數組操作函數,使得複雜的數據處理變得簡單:

  • 快速數組循環和切片
  • 不複製數據的切片操作
  • 高效的數組運算
  • 兼容多種數據格式和庫

這些特性使 NumPy 成為數據科學中不可或缺的工具。

表達能力

NumPy 的另一個重要優勢是其表達能力。它使複雜的多維數組操作變得更加自然和直觀。例如,將向量中的所有值乘以 2 在 NumPy 中可以簡單地表示為:

arr * 2  # 向量中所有元素乘以 2

而在標準 Python 中,這需要使用循環或列表推導式來實現。

NumPy 還提供了許多功能強大的方法和函數,如reshaperepeatfullargmaxdotwhere等,這些函數使代碼更加簡潔,同時保持意圖明確。

NumPy 代碼示例

創建數組

NumPy 提供了多種創建數組的方法:

import numpy as np

# 從列表創建數組
a = np.array([6, 7, 8])
print(a)  # 輸出:array([6, 7, 8])

# 創建全零數組
zeros_array = np.zeros(4)
print(zeros_array)  # 輸出:[0. 0. 0. 0.]

# 創建全一數組
ones_array = np.ones((2, 3, 4), dtype=np.int16)
print(ones_array)  # 創建 2x3x4 的全一整數數組

# 使用 arange 創建序列
sequence = np.arange(5)
print(sequence)  # 輸出:[0 1 2 3 4]

# 使用特定步長創建序列
stepped_sequence = np.arange(1, 9, 2)
print(stepped_sequence)  # 輸出:[1 3 5 7]

# 創建等間隔數組
linear_space = np.linspace(0, 2, 4)  # 從 0 到 2 創建 4 個等間隔點
print(linear_space)  # 輸出:[0.         0.66666667 1.33333333 2.        ]

輸出結果為:

[6 7 8]
[0. 0. 0. 0.]
[[[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]

 [[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]]
[0 1 2 3 4]
[1 3 5 7]
[0.         0.66666667 1.33333333 2.        ]

這些創建數組的方法展示了 NumPy 的靈活性和便利性。

多維數組操作

NumPy 支持創建和操作多維數組:

# 創建多維數組
a = np.arange(15).reshape(3, 5)
print(a)
# 輸出:
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]

# 獲取數組屬性
print(a.shape)  # (3, 5)
print(a.ndim)   # 2
print(a.dtype.name)  # 'int64'
print(a.size)   # 15

# 數組轉置
print(a.transpose())
# 輸出:
# [[ 0  5 10]
#  [ 1  6 11]
#  [ 2  7 12]
#  [ 3  8 13]
#  [ 4  9 14]]

輸出結果為:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
(3, 5)
2
int64
15
[[ 0  5 10]
 [ 1  6 11]
 [ 2  7 12]
 [ 3  8 13]
 [ 4  9 14]]

這些操作在處理圖像、音頻和其他結構化數據時非常有用。

數學運算

NumPy 提供了豐富的數學運算功能:

# 基本運算
a = np.array([1, 2, 3, 6])
b = np.linspace(0, 2, 4)
c = a - b
print(c)  # [1.         1.33333333 1.66666667 4.        ]
print(a**2)  # [1 4 9 36]

# 三角函數
angles = np.linspace(-np.pi, np.pi, 100)
sin_values = np.sin(angles)
cos_values = np.cos(angles)

# 統計運算
b = np.arange(12).reshape(3, 4)
print(b.sum(axis=0))  # 每列的和:[12 15 18 21]
print(b.min(axis=1))  # 每行的最小值:[0 4 8]
print(b.cumsum(axis=1))  # 每行的累積和
# [[ 0  1  3  6]
#  [ 4  9 15 22]
#  [ 8 17 27 38]]

輸出結果為:

[1.         1.33333333 1.66666667 4.        ]
[ 1  4  9 36]
[12 15 18 21]
[0 4 8]
[[ 0  1  3  6]
 [ 4  9 15 22]
 [ 8 17 27 38]]

這些數學運算在數據分析和科學計算中極為實用。

線性代數

NumPy 的線性代數功能強大而全面:

from numpy.linalg import solve, inv

# 創建矩陣
a = np.array([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]])

# 矩陣轉置
print(a.transpose())

# 矩陣求逆
print(inv(a))

# 解線性方程組 ax = b
b = np.array([3, 2, 1])
x = solve(a, b)
print(x)  # [-4.83050847  2.13559322  1.18644068]

# 矩陣乘法
c = np.random.rand(3, 3) * 20  # 創建 3x3 隨機矩陣
print(np.dot(a, c))  # 使用 np.dot
print(a @ c)  # 使用@運算符 (Python 3.5+)

輸出結果為:

[[1.  3.  5. ]
 [2.  4.  9. ]
 [3.  6.7 5. ]]
[[-2.27683616  0.96045198  0.07909605]
 [ 1.04519774 -0.56497175  0.1299435 ]
 [ 0.39548023  0.05649718 -0.11299435]]
[-4.83050847  2.13559322  1.18644068]
[[ 63.51395439  77.93185118  48.04106548]
 [151.50917082 180.78240991 110.49346863]
 [162.43614372 284.16159778 221.23480747]]
[[ 63.51395439  77.93185118  48.04106548]
 [151.50917082 180.78240991 110.49346863]
 [162.43614372 284.16159778 221.23480747]]

這些線性代數功能對於科學計算、機器學習和數據分析至關重要。

結論

NumPy 作為 Python 數據科學生態系統的基石,提供了顯著的性能優勢和豐富的功能,使其成為數據處理和科學計算的首選工具。其主要優勢包括:

  • 更高效的內存使用
  • 更快的執行速度
  • 豐富的高級數組操作
  • 強大的表達能力
  • 良好的生態系統兼容性

無論是數據分析、機器學習還是科學研究,NumPy 都是處理和操作數值數據的理想選擇。隨著數據科學領域的不斷發展,NumPy 的重要性也將持續增長。對於任何希望在 Python 中進行高效數值計算的開發者來說,掌握 NumPy 是一項必不可少的技能。

感謝您閱讀我的文章。歡迎隨時分享你的想法。
後端開發 Python Data ScienceMachine LearningNumPy
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。