Python 生態系提供豐富的函式庫,方便進行資料操作、科學計算和影像處理。NumPy 提供高效的多維陣列運算,是許多科學計算函式庫的基礎。Pandas 則提供 DataFrame 結構,簡化資料處理和分析流程。Scikit-learn 提供機器學習演算法,方便建構和訓練模型。在影像處理方面,Pillow 適用於一般影像處理任務,而 OpenCV 則更專注於電腦視覺應用,Scikit-Image 則以 Python 撰寫,檔案完整且易於使用,適合科學應用。這些函式庫彼此互補,共同構成了 Python 強大的資料科學和影像處理生態系。
資料操作
本章節總結了與資料操作相關的熱門 Python 函式庫,包括數值、文字、影像和音訊處理。這些函式庫各具特殊用途,本章節旨在介紹它們,而非進行比較。除非特別註明,否則所有函式庫都可透過 pip 直接從 PyPI 安裝:
$ pip install 函式庫名稱
表 10-1 簡要描述了這些函式庫的功能
| Python 函式庫 | 授權條款 | 使用原因 |
|---|---|---|
| IPython | Apache 2.0 授權 | 提供增強的 Python 直譯器,具備輸入歷史、整合的偵錯器,以及在終端機中顯示圖形和繪圖(使用 Qt 版本)。 |
| Numpy | BSD 3-clause 授權 | 提供多維陣列和線性代數工具,最佳化了執行速度。 |
| SciPy | BSD 授權 | 提供與工程和科學相關的函式和工具,包括線性代數、訊號處理、積分、根查詢、統計分佈等主題。 |
| Matplotlib | BSD 授權 | 提供科學繪圖功能。 |
| Pandas | BSD 授權 | 提供 Series 和 DataFrame 物件,可進行排序、合併、分組、聚合、索引、視窗和子集操作,類別似於 R 的 Data Frame 或 SQL 查詢結果。 |
| Scikit-Learn | BSD 3-clause 授權 | 提供機器學習演算法,包括降維、分類別、迴歸、聚類別、模型選擇、填補缺失資料和預處理。 |
| Rpy2 | GPLv2 授權 | 提供與 R 的介面,允許在 Python 中執行 R 函式,並在兩種環境之間傳遞資料。 |
| SymPy | BSD 授權 | 提供符號數學運算,包括級數展開、極限和微積分,旨在成為完整的電腦代數系統。 |
| nltk | Apache 授權 | 提供全面的自然語言工具包,包含多種語言的模型和訓練資料。 |
| pillow / PIL | 標準 PIL 授權(類別似 MIT) | 提供大量的檔案格式,以及一些簡單的影像過濾和其他處理功能。 |
| cv2 | Apache 2.0 授權 | 提供適合影片即時分析的電腦視覺例程,包括已訓練好的人臉和人體偵測演算法。 |
| Scikit-Image | BSD 授權 | 提供影像處理例程,包括過濾、調整、色彩分離、邊緣、斑點和角點偵測、分割等。 |
表格內容解密:
此表格列出了多個重要的 Python 資料操作函式庫及其用途。每個函式庫都有其特定的功能和應用領域,例如 NumPy 用於數值運算,Pandas 用於資料處理,而 Scikit-Learn 則用於機器學習。
科學應用
Python 經常被用於高效能的科學應用。它在學術界和科學專案中廣泛使用,因為它易於撰寫且效能良好。由於其高效能特性,Python 中的科學計算通常會使用外部函式庫,這些函式庫通常以更快的語言(如 C 或 FORTRAN,用於矩陣運算)撰寫。主要使用的函式庫都是「SciPy Stack」的一部分:NumPy、SciPy、SymPy、Pandas、Matplotlib 和 IPython。
SciPy Stack 簡介
SciPy Stack 是一系列用於科學計算的 Python 函式庫。它們共同提供了一個完整的科學計算環境,從基本的數值運算到複雜的科學模擬。
IPython
IPython 是增強版的 Python 直譯器,具有彩色介面、更詳細的錯誤訊息,以及允許在終端機中顯示圖形和繪圖的內嵌模式(根據 Qt 的版本)。它是 Jupyter Notebook 的預設核心,也是在 Spyder IDE 中的預設直譯器。
NumPy
NumPy 是 SciPy 專案的一部分,但作為獨立的函式庫釋出,以便只需要基本功能的使用者可以不需安裝整個 SciPy。NumPy 利用多維陣列和對陣列進行操作的函式來克服 Python 執行較慢演算法的問題。任何演算法都可以表示為對陣列的操作,從而快速執行。
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
print(x)
# 輸出:
# array([[1, 2, 3],
# [4, 5, 6]])
result = x.dot([2,2,1])
print(result)
# 輸出:array([ 9, 24])
result = x * [[1],[0]]
print(result)
# 輸出:
# array([[1, 2, 3],
# [0, 0, 0]])
程式碼內容解密:
import numpy as np:匯入 NumPy 函式庫並簡寫為np。x = np.array([[1,2,3],[4,5,6]]):建立一個二維陣列x。x.dot([2,2,1]):計算矩陣x和向量[2,2,1]的點積。x * [[1],[0]]:對x和[[1],[0]]進行元素級別的乘法,利用廣播機制將[[1],[0]]對齊到x的形狀進行運算。
此範例展示了 NumPy 的基本矩陣運算,包括矩陣乘法和元素級別的乘法(廣播)。這些操作在科學計算中非常常見且高效。
重點整理
- 本章節介紹了多個用於資料操作的 Python 函式庫,包括 NumPy、Pandas 和 Scikit-Learn 等。
- 每個函式庫都有其特定的用途和優勢。
- SciPy Stack 為科學計算提供了一個完整的環境。
- IPython 和 Jupyter Notebook 為互動式計算提供了便利的工具。
- NumPy 的多維陣列操作是科學計算的基礎。
科學計算與資料分析工具
在科學計算與資料分析領域,Python 提供了多種強大的函式庫來支援各種任務。這些函式庫涵蓋了從數值計算到資料視覺化的廣泛範圍,並且大多數都根據 NumPy 陣列進行操作。
SciPy
SciPy 是建立在 NumPy 之上的科學計算函式庫,提供了更多數學函式和科學計算工具。它包含了線性代數、微積分、特殊函式和常數、訊號處理等模組。例如,使用 SciPy 的物理常數模組可以輕鬆進行單位轉換和存取物理常數。
import scipy.constants
fahrenheit = 212
print(scipy.constants.F2C(fahrenheit)) # 輸出:100.0
print(scipy.constants.physical_constants['electron mass'])
# 輸出:(9.10938356e-31, 'kg', 1.1e-38)
內容解密:
scipy.constants.F2C(fahrenheit)將華氏溫度轉換為攝氏溫度。scipy.constants.physical_constants['electron mass']提供了電子品質的值、單位和不確定度。
Matplotlib
Matplotlib 是一個靈活的繪圖函式庫,用於建立互動式的 2D 和 3D 圖形,並可儲存為高品質的圖檔。其 API 與 MATLAB 相似,便於 MATLAB 使用者轉換到 Python。此外,Matplotlib 提供了豐富的範例和原始碼,用於重現各種圖形。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.show()
內容解密:
np.linspace(0, 10, 100)生成從 0 到 10 的 100 個等間隔數值。plt.plot(x, y)繪製 x 和 y 的關係圖。plt.show()顯示圖形。
Pandas
Pandas 是一個根據 NumPy 的資料操作函式庫,提供了豐富的功能來存取、索引、合併和分組資料。其主要資料結構 DataFrame 與 R 語言中的資料表類別似,支援異質資料、時間序列操作和自動對齊。
import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter', 'Linda'],
'Age': [28, 24, 35, 32],
'City': ['New York', 'Paris', 'Berlin', 'London']}
df = pd.DataFrame(data)
print(df)
內容解密:
pd.DataFrame(data)將字典資料轉換為 DataFrame。- DataFrame 自動為資料新增索引,並支援多種資料型別。
Scikit-Learn
Scikit-Learn 是一個機器學習函式庫,提供了降維、缺失資料填補、迴歸和分類別模型、樹模型、聚類別等功能。它與 NumPy 陣列和 Pandas DataFrame 相容,並且提供了豐富的範例和檔案。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)
model = LogisticRegression()
model.fit(X_train, y_train)
print(model.score(X_test, y_test))
內容解密:
load_iris()載入 Iris 資料集。train_test_split()將資料集分割為訓練集和測試集。LogisticRegression()建立邏輯迴歸模型,並使用訓練集進行訓練。model.score()評估模型在測試集上的準確度。
SymPy
SymPy 是用於符號數學計算的函式庫,可以進行符號積分、微分、展開表示式等操作。它完全由 Python 編寫,並可選用擴充套件來提升速度和支援繪圖。
import sympy as sym
x = sym.Symbol('x')
f = sym.exp(-x**2/2) / sym.sqrt(2 * sym.pi)
print(sym.integrate(f, x))
# 輸出:erf(sqrt(2)*x/2)/2
內容解密:
sym.Symbol('x')定義符號變數 x。sym.integrate(f, x)對函式 f 進行符號積分。
文書處理與文字探勘
Python 的字串處理工具非常強大,適合用於文書處理和文字探勘任務。除了標準函式庫中的工具外,自然語言工具包(NLTK)是社群中最常用的文字探勘工具之一。
import re
text = "Hello, world! Hello again."
print(re.findall(r'Hello', text))
# 輸出:['Hello', 'Hello']
內容解密:
re.findall(r'Hello', text)使用正規表示式查詢 text 中所有出現的 “Hello”。
文書處理與文字探勘
在 Python 中,文書處理與文字探勘是兩個非常重要的領域。有許多函式庫可以幫助我們處理文字資料,包括 nltk、re、difflib 等。
正規表示式(re)
正規表示式是一種用於描述字串模式的語言。它可以用於搜尋、驗證和提取字串中的資料。Python 中的 re 模組提供了對正規表示式的支援。
difflib 模組
difflib 模組用於比較字串之間的差異。它提供了一個 get_close_matches() 函式,可以幫助我們找出與給定字串最相似的字串。
import difflib
capitals = ('Montgomery', 'Juneau', 'Phoenix', 'Little Rock')
print(difflib.get_close_matches('Fenix', capitals)) # ['Phoenix']
內容解密:
difflib.get_close_matches()函式用於找出與給定字串最相似的字串。- 在這個例子中,我們傳入了一個錯誤拼寫的城市名稱 ‘Fenix’,函式回傳了最相似的正確城市名稱 ‘Phoenix’。
nltk 函式庫
nltk 是 Python 中一個非常強大的文書處理函式庫。它提供了許多功能,包括文字分詞、詞性標註、命名實體識別等。
安裝 nltk
要使用 nltk,首先需要安裝它。可以使用 pip 安裝:
pip install numpy
pip install nltk
下載 nltk 資料
nltk 需要下載一些資料才能正常運作。可以使用以下命令下載:
import nltk
nltk.download('punkt', download_dir='/usr/local/share/nltk_data')
nltk.download('stopwords', download_dir='/usr/local/share/nltk_data')
內容解密:
nltk.download()函式用於下載 nltk 資料。- ‘punkt’ 是一個用於分詞的資料包。
- ‘stopwords’ 是一個包含常見停用詞的資料包。
使用 nltk 處理文字
以下是一個使用 nltk 處理文字的例子:
import nltk
from nltk.corpus import stopwords
import string
stopwords.ensure_loaded()
text = open('zen.txt').read()
tokens = [t.casefold() for t in nltk.tokenize.word_tokenize(text) if t not in string.punctuation]
counter = {}
for bigram in nltk.bigrams(tokens):
counter[bigram] = 1 if bigram not in counter else counter[bigram] + 1
def print_counts(counter):
for ngram, count in sorted(counter.items(), key=lambda kv: kv[1], reverse=True):
if count > 1:
print('{:>25}: {}'.format(str(ngram), '*' * count))
print_counts(counter)
kept_tokens = [t for t in tokens if t not in stopwords.words()]
from collections import Counter
c = Counter(kept_tokens)
print(c.most_common(5))
內容解密:
nltk.tokenize.word_tokenize()函式用於將文字分詞。nltk.bigrams()函式用於產生二元片語。Counter類別用於計算詞頻。stopwords.words()函式用於取得停用詞列表。
SyntaxNet
SyntaxNet 是 Google 開源的一個語法分析工具。它根據 TensorFlow,提供了一個訓練好的英文解析器(Parsey McParseface)和一個框架,用於建立其他語言的模型。
影像處理
Python 中有許多影像處理函式庫,包括 Pillow、OpenCV 和 Scikit-Image 等。這些函式庫提供了許多功能,包括影像格式轉換、影像處理和影像分析等。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python資料操作與影像處理函式庫
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml
此圖示展示了文書處理和影像處理的相關函式庫。
內容解密:
- 文書處理相關函式庫包括
nltk、re和difflib。 - 影像處理相關函式庫包括 Pillow、OpenCV 和 Scikit-Image。
資料處理與影像處理函式庫介紹
在Python中,影像處理和資料持久化是兩個重要的領域,分別由多個強大的函式庫支援。本篇文章將重點介紹影像處理相關的函式庫,包括Pillow、OpenCV和Scikit-Image,以及簡要介紹資料持久化的相關概念。
影像處理函式庫
Pillow
Pillow是Python Imaging Library(PIL)的活躍分支,提供了一套完整的影像處理功能。由於PIL最後一次更新是在2009年,且不支援Python 3,Pillow的出現彌補了這一空缺。Pillow支援多種作業系統和Python 3,使得它成為Python中影像處理的基礎函式庫。
安裝Pillow之前,需要先安裝其前置依賴套件,可以參考Pillow的官方安裝。安裝完成後,可以透過pip直接安裝Pillow:
$ pip install Pillow
以下是一個簡單的Pillow使用範例:
from PIL import Image, ImageFilter
# 讀取影像
im = Image.open('image.jpg')
# 顯示影像
im.show()
# 對影像套用濾鏡
im_sharp = im.filter(ImageFilter.SHARPEN)
# 將處理後的影像儲存為新檔案
im_sharp.save('image_sharpened.jpg', 'JPEG')
# 將影像分解為RGB三個頻道
r, g, b = im_sharp.split()
# 讀取影像中的EXIF資料
exif_data = im._getexif()
exif_data
#### 內容解密:
- 讀取和顯示影像:使用
Image.open()讀取影像,並使用show()方法顯示影像。 - 套用濾鏡:使用
filter()方法並傳入ImageFilter.SHARPEN引數,對影像進行銳化處理。 - 儲存處理後的影像:使用
save()方法將處理後的影像儲存為新的JPEG檔案。 - 分解影像頻道:使用
split()方法將影像分解為RGB三個頻道。 - 讀取EXIF資料:使用
_getexif()方法讀取影像中的EXIF資料。
OpenCV
OpenCV(Open Source Computer Vision Library)是一個更為進階的影像處理和電腦視覺函式庫。它以C和C++撰寫,專注於實時電腦視覺應用。OpenCV提供了豐富的功能,包括人臉檢測、人物檢測等模型,並且支援多種程式語言。
在Python中使用OpenCV,需要安裝cv2和NumPy函式庫。以下是OpenCV的一個簡單範例:
import cv2
import numpy as np
# 讀取影像
img = cv2.imread('testimg.jpg')
# 顯示影像
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 將影像轉換為灰階
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 將灰階影像儲存為新檔案
cv2.imwrite('graytest.jpg', gray)
#### 內容解密:
- 讀取和顯示影像:使用
cv2.imread()讀取影像,並使用cv2.imshow()顯示影像。 - 轉換為灰階:使用
cv2.cvtColor()將影像轉換為灰階。 - 儲存灰階影像:使用
cv2.imwrite()將灰階影像儲存為新的JPEG檔案。
Scikit-Image
Scikit-Image是一個較新的影像處理函式庫,由於其原始碼多以Python撰寫且檔案詳盡,因此逐漸受到歡迎。雖然它不像OpenCV那樣擁有完整的實時視訊處理演算法,但它提供了足夠的科學應用功能,如斑點檢測、特徵檢測等。
資料持久化簡介
資料持久化是指將資料儲存到可持久儲存的儲存媒體中,如資料函式庫或檔案。本章主要介紹了與關聯式資料函式庫互動的Python函式庫,以及一些結構化檔案的處理工具,如JSON、XML、YAML等。