返回文章列表

Python資料操作與影像處理函式庫

本文介紹 Python 中常用的資料操作和影像處理函式庫,包含 NumPy、Pandas、Scikit-learn、Pillow、OpenCV 和 Scikit-Image

程式開發 資料科學

Python 生態系提供豐富的函式庫,方便進行資料操作、科學計算和影像處理。NumPy 提供高效的多維陣列運算,是許多科學計算函式庫的基礎。Pandas 則提供 DataFrame 結構,簡化資料處理和分析流程。Scikit-learn 提供機器學習演算法,方便建構和訓練模型。在影像處理方面,Pillow 適用於一般影像處理任務,而 OpenCV 則更專注於電腦視覺應用,Scikit-Image 則以 Python 撰寫,檔案完整且易於使用,適合科學應用。這些函式庫彼此互補,共同構成了 Python 強大的資料科學和影像處理生態系。

資料操作

本章節總結了與資料操作相關的熱門 Python 函式庫,包括數值、文字、影像和音訊處理。這些函式庫各具特殊用途,本章節旨在介紹它們,而非進行比較。除非特別註明,否則所有函式庫都可透過 pip 直接從 PyPI 安裝:

$ pip install 函式庫名稱

表 10-1 簡要描述了這些函式庫的功能

Python 函式庫授權條款使用原因
IPythonApache 2.0 授權提供增強的 Python 直譯器,具備輸入歷史、整合的偵錯器,以及在終端機中顯示圖形和繪圖(使用 Qt 版本)。
NumpyBSD 3-clause 授權提供多維陣列和線性代數工具,最佳化了執行速度。
SciPyBSD 授權提供與工程和科學相關的函式和工具,包括線性代數、訊號處理、積分、根查詢、統計分佈等主題。
MatplotlibBSD 授權提供科學繪圖功能。
PandasBSD 授權提供 Series 和 DataFrame 物件,可進行排序、合併、分組、聚合、索引、視窗和子集操作,類別似於 R 的 Data Frame 或 SQL 查詢結果。
Scikit-LearnBSD 3-clause 授權提供機器學習演算法,包括降維、分類別、迴歸、聚類別、模型選擇、填補缺失資料和預處理。
Rpy2GPLv2 授權提供與 R 的介面,允許在 Python 中執行 R 函式,並在兩種環境之間傳遞資料。
SymPyBSD 授權提供符號數學運算,包括級數展開、極限和微積分,旨在成為完整的電腦代數系統。
nltkApache 授權提供全面的自然語言工具包,包含多種語言的模型和訓練資料。
pillow / PIL標準 PIL 授權(類別似 MIT)提供大量的檔案格式,以及一些簡單的影像過濾和其他處理功能。
cv2Apache 2.0 授權提供適合影片即時分析的電腦視覺例程,包括已訓練好的人臉和人體偵測演算法。
Scikit-ImageBSD 授權提供影像處理例程,包括過濾、調整、色彩分離、邊緣、斑點和角點偵測、分割等。

表格內容解密:

此表格列出了多個重要的 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]])

程式碼內容解密:

  1. import numpy as np:匯入 NumPy 函式庫並簡寫為 np
  2. x = np.array([[1,2,3],[4,5,6]]):建立一個二維陣列 x
  3. x.dot([2,2,1]):計算矩陣 x 和向量 [2,2,1] 的點積。
  4. 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)

內容解密:

  1. scipy.constants.F2C(fahrenheit) 將華氏溫度轉換為攝氏溫度。
  2. 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()

內容解密:

  1. np.linspace(0, 10, 100) 生成從 0 到 10 的 100 個等間隔數值。
  2. plt.plot(x, y) 繪製 x 和 y 的關係圖。
  3. 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)

內容解密:

  1. pd.DataFrame(data) 將字典資料轉換為 DataFrame。
  2. 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))

內容解密:

  1. load_iris() 載入 Iris 資料集。
  2. train_test_split() 將資料集分割為訓練集和測試集。
  3. LogisticRegression() 建立邏輯迴歸模型,並使用訓練集進行訓練。
  4. 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

內容解密:

  1. sym.Symbol('x') 定義符號變數 x。
  2. sym.integrate(f, x) 對函式 f 進行符號積分。

文書處理與文字探勘

Python 的字串處理工具非常強大,適合用於文書處理和文字探勘任務。除了標準函式庫中的工具外,自然語言工具包(NLTK)是社群中最常用的文字探勘工具之一。

import re

text = "Hello, world! Hello again."
print(re.findall(r'Hello', text))  
# 輸出:['Hello', 'Hello']

內容解密:

  1. re.findall(r'Hello', text) 使用正規表示式查詢 text 中所有出現的 “Hello”。

文書處理與文字探勘

在 Python 中,文書處理與文字探勘是兩個非常重要的領域。有許多函式庫可以幫助我們處理文字資料,包括 nltkredifflib 等。

正規表示式(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

此圖示展示了文書處理和影像處理的相關函式庫。

內容解密:

  • 文書處理相關函式庫包括 nltkredifflib
  • 影像處理相關函式庫包括 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

#### 內容解密:

  1. 讀取和顯示影像:使用Image.open()讀取影像,並使用show()方法顯示影像。
  2. 套用濾鏡:使用filter()方法並傳入ImageFilter.SHARPEN引數,對影像進行銳化處理。
  3. 儲存處理後的影像:使用save()方法將處理後的影像儲存為新的JPEG檔案。
  4. 分解影像頻道:使用split()方法將影像分解為RGB三個頻道。
  5. 讀取EXIF資料:使用_getexif()方法讀取影像中的EXIF資料。

OpenCV

OpenCV(Open Source Computer Vision Library)是一個更為進階的影像處理和電腦視覺函式庫。它以C和C++撰寫,專注於實時電腦視覺應用。OpenCV提供了豐富的功能,包括人臉檢測、人物檢測等模型,並且支援多種程式語言。

在Python中使用OpenCV,需要安裝cv2NumPy函式庫。以下是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)

#### 內容解密:

  1. 讀取和顯示影像:使用cv2.imread()讀取影像,並使用cv2.imshow()顯示影像。
  2. 轉換為灰階:使用cv2.cvtColor()將影像轉換為灰階。
  3. 儲存灰階影像:使用cv2.imwrite()將灰階影像儲存為新的JPEG檔案。

Scikit-Image

Scikit-Image是一個較新的影像處理函式庫,由於其原始碼多以Python撰寫且檔案詳盡,因此逐漸受到歡迎。雖然它不像OpenCV那樣擁有完整的實時視訊處理演算法,但它提供了足夠的科學應用功能,如斑點檢測、特徵檢測等。

資料持久化簡介

資料持久化是指將資料儲存到可持久儲存的儲存媒體中,如資料函式庫或檔案。本章主要介紹了與關聯式資料函式庫互動的Python函式庫,以及一些結構化檔案的處理工具,如JSON、XML、YAML等。