大家好,歡迎來到數據新手村的第十天!昨天學會了如何像X光一樣,透視一個 NumPy 陣列的內部屬性 (shape
, dtype
等)。
但光會檢驗還不夠,真正的魔法師需要能夠「無中生有」。今天就要來學習 NumPy 中各種強大的陣列創建方法,能像魔法師一樣,根據不同的需求,隨心所欲地變出各種陣列。
在數據分析中,我們常常需要先建立一個固定形狀的「容器」陣列,之後再填入計算結果。NumPy 提供了多種函式來快速完成這件事。
np.zeros()
和 np.ones()
這是最常用的兩個函式,分別用來建立內容全為 0
或全為 1
的陣列。
import numpy as np
# 預定義形狀
# 建立一個 2 列 3 欄,內容全為 0 的陣列
arr = np.zeros((2, 3))
print(arr)
print(arr.dtype)
arr = np.zeros((2, 3), dtype=int)
print(arr)
print(arr.dtype)
輸出結果:
[[0. 0. 0.]
[0. 0. 0.]]
float64
[[0 0 0]
[0 0 0]]
int64
# 建立一個 3 列 2 欄,內容全為 1 的整數陣列
arr = np.ones((5, 8), dtype=int)
print(arr)
輸出結果:
[[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]]
np.full() 和 np.empty()
如果想用特定的數字填滿陣列,可以使用 np.full()。而 np.empty() 則是一個有趣的函式,它只負責分配記憶體空間,但不做任何初始化,所以裡面的值會是記憶體中殘留的「垃圾值」,這麼做是為了追求極致的效能。
# 建立一個未初始化的 4x2 陣列 (內容是隨機的垃圾值)
arr1 = np.empty((4, 2))
print(arr1)
輸出結果:
[[0. 0.]
[0. 0.]
[0. 0.]
[0. 0.]]
# 固定值的陣列
arr = np.full((3, 4), 2025)
print(arr)
輸出結果:
[[2025 2025 2025 2025]
[2025 2025 2025 2025]
[2025 2025 2025 2025]]
補充
# 補充:與其他陣列格式一樣
arr1 = np.zeros_like(arr)
print(arr1)
arr1 = np.ones_like(arr)
print(arr1)
arr1 = np.empty_like(arr)
print(arr1)
arr1 = np.full_like(arr, 2026)
print(arr1)
輸出結果:
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[2026 2026 2026 2026]
[2026 2026 2026 2026]
[2026 2026 2026 2026]]
np.arange()
類似 Python 內建的 range(),可以建立一個等差數列。
# 等差數列 ex. 2 4 6 8 10
arr = np.arange(1, 10, 1) # start ,end, step(步長)
print(arr)
輸出結果:
[1 2 3 4 5 6 7 8 9]
np.linspace()
linspace 更適合科學計算,它的重點不是「間隔」,而是「元素總數」。它會在指定的起點和終點之間,切出指定數量的等距點。
# <等間格數列>在 0 到 10 之間,切出 5 個等距的點 (包含起點和終點)
arr = np.linspace(0, 100, 5) # 起始, 終點, 間隔數
print(arr)
輸出結果:
[ 0. 25. 50. 75. 100.]
arr = np.linspace(0, 100, 5, dtype=int) # 起始, 終點, 間隔數
print(arr)
arr = np.arange(0, 101, 25)
print(arr)
輸出結果:
[ 0 25 50 75 100]
[ 0 25 50 75 100]
# 對數間隔數列
arr = np.logspace(0, 4, 3, base=2) # 起始, 終點, 間隔數, 以X為底數(2^0, 2^2, 2^4)
print(arr)
輸出結果:
[ 1. 4. 16.]
# 特殊矩陣
# 單位矩陣:主對角線上的數字為1,其他數字為0
arr = np.eye(3, dtype=int)
print(arr)
arr = np.eye(3, 4, dtype=int)
print(arr)
輸出結果:
[[1 0 0]
[0 1 0]
[0 0 1]]
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]]
# 對角矩陣:主對角線上非零的數字,其他數字為0
arr = np.diag([1, 2, 3])
print(arr)
輸出結果:
[[1 0 0]
[0 2 0]
[0 0 3]]
# 隨機陣列的生成
# 建立一個 3x4,數值在0到1之間的隨機浮點數(均勻分布)
arr = np.random.randn(3, 4)
print(arr)
輸出結果:
[[ 1.04479078 0.89212449 -0.62309296 -1.10214289]
[ 0.4521997 -0.9513508 0.22336738 1.67683534]
[ 0.3863425 0.05195079 -0.05229478 0.4322022 ]]
[請在此處插入您執行以上所有程式碼的截圖]
# 生成指定範圍區間的隨機浮點數
arr = np.random.uniform(3, 6, (2, 3))
print(arr)
輸出結果:
[[3.28559207 5.4147249 3.30798133]
[3.43318571 5.39346086 5.06550149]]
# 生成指定範圍區間的隨機整數
arr = np.random.randint(3, 30, (2, 3))
print(arr)
輸出結果:
[[26 14 14]
[ 3 17 25]]
# 生成數值符合「標準常態分佈」的隨機陣列
# randn 標準正態分布,平均值為 0,標準差為 1
# 兩側小,中間大
arr = np.random.randn(2, 3)
print(arr)
輸出結果:
[[-0.44642239 1.8460259 -0.05766703]
[-0.42963074 0.94026878 -0.04090706]]
可重現的「隨機」:np.random.seed()
還記得我們提過的「隨機播放清單」比喻嗎?np.random.seed() 可以固定隨機數的生成順序,讓實驗結果可以被重現。
# 設置隨機種子,讓隨機結果固定下來
np.random.seed(20)
arr = np.random.randint(1, 10, (2, 5))
print(arr) # 不論幾次數字都一樣
輸出結果:
[[4 5 7 8 3]
[1 7 9 6 4]]
結語
今天學會了 NumPy 中各種「無中生有」的陣列創建方法。掌握了這些,就能為各種分析場景快速準備好需要的數據結構。
現在擁有一個強大的軍火庫來創建各種陣列。明天,Day 11,將學習如何從這些陣列中,精準地取出想要的資料——索引與切片神技。敬請期待!