用 NumPy 進(jìn)行科學(xué)計(jì)算的 12 個(gè)核心功能
NumPy 是 Python 中用于科學(xué)計(jì)算的一個(gè)非常強(qiáng)大的庫。它提供了多維數(shù)組對(duì)象、各種派生對(duì)象(如掩碼數(shù)組和矩陣),以及用于數(shù)組快速操作的各種函數(shù)。今天,我們就來一起學(xué)習(xí) NumPy 的 12 個(gè)核心功能,幫助你在科學(xué)計(jì)算中更加得心應(yīng)手。
1. 創(chuàng)建數(shù)組
NumPy 最基本的功能之一就是創(chuàng)建數(shù)組。你可以使用 numpy.array 函數(shù)從列表或其他序列類型的數(shù)據(jù)創(chuàng)建數(shù)組。
import numpy as np
# 從列表創(chuàng)建一維數(shù)組
a = np.array([1, 2, 3, 4])
print(a) # 輸出: [1 2 3 4]
# 從嵌套列表創(chuàng)建二維數(shù)組
b = np.array([[1, 2], [3, 4]])
print(b)
# 輸出:
# [[1 2]
# [3 4]]
2. 數(shù)組的形狀和大小
了解數(shù)組的形狀和大小對(duì)于處理數(shù)據(jù)非常重要。你可以使用 shape 屬性來獲取數(shù)組的形狀,使用 size 屬性來獲取數(shù)組中的元素總數(shù)。
# 獲取數(shù)組的形狀
print(a.shape) # 輸出: (4,)
print(b.shape) # 輸出: (2, 2)
# 獲取數(shù)組的大小
print(a.size) # 輸出: 4
print(b.size) # 輸出: 4
3. 數(shù)組的重塑
有時(shí)候你需要改變數(shù)組的形狀,這時(shí)候可以使用 reshape 方法。
# 重塑數(shù)組
c = a.reshape(2, 2)
print(c)
# 輸出:
# [[1 2]
# [3 4]]
# 驗(yàn)證形狀是否改變
print(c.shape) # 輸出: (2, 2)
4. 數(shù)組的索引和切片
NumPy 數(shù)組支持多種索引和切片方式,類似于 Python 列表,但更強(qiáng)大。
# 一維數(shù)組的索引
print(a[0]) # 輸出: 1
# 一維數(shù)組的切片
print(a[1:3]) # 輸出: [2 3]
# 二維數(shù)組的索引
print(b[0, 1]) # 輸出: 2
# 二維數(shù)組的切片
print(b[0:2, 1]) # 輸出: [2 4]
5. 數(shù)組的運(yùn)算
NumPy 支持多種數(shù)組運(yùn)算,包括加法、減法、乘法和除法等。
# 數(shù)組加法
d = a + a
print(d) # 輸出: [2 4 6 8]
# 數(shù)組乘法
e = a * 2
print(e) # 輸出: [2 4 6 8]
# 數(shù)組點(diǎn)積
f = np.dot(a, b)
print(f) # 輸出: [14 32]
6. 布爾索引
布爾索引是一種非常強(qiáng)大的工具,可以用來根據(jù)條件選擇數(shù)組中的元素。
# 布爾索引
g = a > 2
print(g) # 輸出: [False False True True]
# 使用布爾索引選擇元素
h = a[g]
print(h) # 輸出: [3 4]
7. 數(shù)組的排序
NumPy 提供了多種排序方法,例如 sort 和 argsort。
# 排序數(shù)組
i = np.sort(a)
print(i) # 輸出: [1 2 3 4]
# 獲取排序后的索引
j = np.argsort(a)
print(j) # 輸出: [0 1 2 3]
8. 數(shù)組的統(tǒng)計(jì)函數(shù)
NumPy 提供了許多統(tǒng)計(jì)函數(shù),如 mean、median、std 等。
# 計(jì)算平均值
k = np.mean(a)
print(k) # 輸出: 2.5
# 計(jì)算中位數(shù)
l = np.median(a)
print(l) # 輸出: 2.5
# 計(jì)算標(biāo)準(zhǔn)差
m = np.std(a)
print(m) # 輸出: 1.118033988749895
9. 數(shù)組的廣播
廣播是 NumPy 中一個(gè)非常重要的概念,它允許不同形狀的數(shù)組進(jìn)行運(yùn)算。
# 廣播示例
n = np.array([[1, 2], [3, 4]])
o = np.array([10, 20])
p = n + o
print(p)
# 輸出:
# [[11 22]
# [13 24]]
10. 數(shù)組的合并和拆分
NumPy 提供了多種方法來合并和拆分?jǐn)?shù)組,如 concatenate、vstack、hstack 等。
# 合并數(shù)組
q = np.array([5, 6])
r = np.concatenate((a, q))
print(r) # 輸出: [1 2 3 4 5 6]
# 拆分?jǐn)?shù)組
s = np.split(r, 2)
print(s)
# 輸出:
# [array([1, 2, 3]), array([4, 5, 6])]
11. 數(shù)組的隨機(jī)數(shù)生成
NumPy 提供了多種生成隨機(jī)數(shù)的方法,如 random.rand、random.randint 等。
# 生成隨機(jī)數(shù)組
t = np.random.rand(3, 3)
print(t)
# 輸出:
# [[0.12345678 0.98765432 0.54321098]
# [0.65432109 0.78901234 0.23456789]
# [0.34567890 0.45678901 0.56789012]]
# 生成隨機(jī)整數(shù)數(shù)組
u = np.random.randint(0, 10, size=(3, 3))
print(u)
# 輸出:
# [[7 2 5]
# [9 4 1]
# [8 3 6]]
12. 數(shù)組的線性代數(shù)運(yùn)算
NumPy 提供了豐富的線性代數(shù)運(yùn)算函數(shù),如 dot、inv、det 等。
# 計(jì)算矩陣的逆
v = np.array([[1, 2], [3, 4]])
w = np.linalg.inv(v)
print(w)
# 輸出:
# [[-2. 1. ]
# [ 1.5 -0.5]]
# 計(jì)算行列式
x = np.linalg.det(v)
print(x) # 輸出: -2.0
實(shí)戰(zhàn)案例:圖像處理
假設(shè)我們有一個(gè)灰度圖像,存儲(chǔ)為一個(gè)二維數(shù)組。我們需要將圖像中的所有像素值歸一化到 0 到 1 之間。
# 生成一個(gè)模擬的灰度圖像
image = np.random.randint(0, 256, size=(100, 100))
# 歸一化圖像
normalized_image = image / 255.0
# 打印歸一化后的圖像
print(normalized_image)
在這個(gè)案例中,我們使用了 NumPy 的數(shù)組運(yùn)算和廣播功能,將圖像中的所有像素值歸一化到 0 到 1 之間。這在圖像處理中是一個(gè)常見的預(yù)處理步驟。
總結(jié)
本文介紹了 NumPy 的 12 個(gè)核心功能,包括創(chuàng)建數(shù)組、數(shù)組的形狀和大小、數(shù)組的重塑、索引和切片、數(shù)組的運(yùn)算、布爾索引、排序、統(tǒng)計(jì)函數(shù)、廣播、合并和拆分、隨機(jī)數(shù)生成以及線性代數(shù)運(yùn)算。通過這些功能,你可以在科學(xué)計(jì)算中更加高效地處理數(shù)據(jù)。