零基礎小白的 NumPy 入門指南
如果你想用電競(打游戲)的思路理解編程:Python 是基礎操作鍵位,而 NumPy 就是 “英雄專屬技能包”—— 專門幫你搞定 “數值計算” 這類復雜任務,比如算游戲里的傷害公式、地圖坐標,或是現實里的成績統計、數據圖表。下面用最通俗的話,把 NumPy 的核心用法拆成 “技能介紹” 和 “操作教程”,小白也能輕松看懂。
一、先搞懂:NumPy 到底能幫我們做什么?
Python 自帶的 “計算器”(比如+、-、×、÷
,還有math
模塊)只能算 “單個數字”,比如算 “1+1=2”“根號 4=2”。但如果遇到 “批量計算”,比如 “100 個學生的成績都加 5 分”“算 30 個坐標點到原點的距離”,自帶計算器就會 “手忙腳亂”—— 要寫很多重復代碼。
NumPy 的核心優勢就是:能批量處理 “數組”(可以理解成 “一堆數字的集合”),還自帶很多高級數學公式,比如三角函數、矩陣運算,不用我們自己寫復雜邏輯,調用現成的 “技能” 就行。
二、NumPy 的核心技能:8 類常用數學函數
你不用死記硬背,先知道 “遇到什么問題,該用哪個技能”,用到時查一下就行。下面按 “使用場景” 分類,每個技能配 “大白話解釋” 和簡單例子。
1. 三角函數(解決 “角度 / 弧度” 相關問題)
比如游戲里角色旋轉角度換算、物理引擎里的拋物線計算,都會用到角度和弧度的轉換,或是正弦、余弦值。
函數 | 大白話作用 | 簡單例子(先導入 NumPy:import numpy as np ) |
---|---|---|
np.sin(x) | 算 x 的正弦值(x 是弧度) | np.sin(np.pi/2) ?→ 結果是 1.0(90 度的正弦值) |
np.cos(x) | 算 x 的余弦值(x 是弧度) | np.cos(np.pi) ?→ 結果是 - 1.0(180 度的余弦值) |
np.rad2deg(x) | 把弧度轉成角度(常用!) | np.rad2deg(np.pi) ?→ 結果是 180.0(π 弧度 = 180 度) |
np.deg2rad(x) | 把角度轉成弧度(常用!) | np.deg2rad(90) ?→ 結果是 π/2(90 度 =π/2 弧度) |
np.hypot(x1,x2) | 直角三角形求斜邊(x1、x2 是直角邊) | np.hypot(3,4) ?→ 結果是 5.0(3、4、5 直角三角形) |
2. 雙曲函數(偏數學,但偶爾會用)
和三角函數類似,但針對 “雙曲曲線”(比如電場、磁場里的曲線計算),日常用得少,知道有這些功能就行:np.sinh(x)
(雙曲正弦)、np.cosh(x)
(雙曲余弦)、np.tanh(x)
(雙曲正切)。
3. 數值修約(“四舍五入” 進階版)
比如統計成績時,“把 60.3 分保留 1 位小數”“把 59.8 分湊整成 60 分”,這些 “調整數字位數” 的操作,叫 “數值修約”。
函數 | 大白話作用 | 例子(假設a = [1.23, 2.56, -3.78] ) |
---|---|---|
np.around(a) | 四舍五入到整數 | np.around(a) ?→ [1. 3. -4.] |
np.floor(a) | 向下取整(“地板”,取比它小的最大整數) | np.floor(a) ?→ [1. 2. -4.] |
np.ceil(a) | 向上取整(“天花板”,取比它大的最小整數) | np.ceil(a) ?→ [2. 3. -3.] |
np.fix(a) | 向 0 取整(正數往下、負數往上) | np.fix(a) ?→ [1. 2. -3.] |
4. 求和、求積、差分(批量算 “總和”“乘積”“差值”)
比如 “算 10 個學生的總分”“算 5 個數據的乘積”“算每天溫度的變化量”,用這些函數一步到位。
函數 | 大白話作用 | 例子(假設a = [1,2,3,4,5] ) |
---|---|---|
np.sum(a) | 算數組所有元素的總和 | np.sum(a) ?→ 15(1+2+3+4+5) |
np.prod(a) | 算數組所有元素的乘積 | np.prod(a) ?→ 120(1×2×3×4×5) |
np.cumsum(a) | 算 “累積和”(逐個加,存中間結果) | np.cumsum(a) ?→ [1,3,6,10,15] |
np.diff(a) | 算 “相鄰元素的差值”(后一個減前一個) | np.diff(a) ?→ [1,1,1,1](2-1,3-2 等) |
5. 指數和對數(復雜數學計算)
比如 “算 2 的 10 次方”“算自然對數(ln)”,這些在概率統計、機器學習里常用。
函數 | 大白話作用 | 例子 |
---|---|---|
np.exp(x) | 算 e 的 x 次方(e 是數學常數,約 2.718) | np.exp(1) ?→ 2.718... |
np.log(x) | 算自然對數(ln x) | np.log(np.e) ?→ 1.0 |
np.log10(x) | 算常用對數(log?? x,比如算 pH 值) | np.log10(100) ?→ 2.0 |
np.log2(x) | 算二進制對數(log? x,比如算文件大小) | np.log2(8) ?→ 3.0 |
6. 算術運算(數組版 “加減乘除”)
Python 自帶的+、-
只能算單個數字,NumPy 的這些函數能直接算 “兩個數組對應位置的加減乘除”,不用寫循環。
函數 | 大白話作用 | 例子(a1 = [1,2,3] ,a2 = [4,5,6] ) |
---|---|---|
np.add(a1,a2) | 兩個數組對應元素相加 | [1+4, 2+5, 3+6] ?→ [5,7,9] |
np.multiply(a1,a2) | 兩個數組對應元素相乘 | [1×4, 2×5, 3×6] ?→ [4,10,18] |
np.divide(a1,a2) | 兩個數組對應元素相除(a1÷a2) | [1/4, 2/5, 3/6] ?→ [0.25,0.4,0.5] |
np.power(a1,a2) | 算 a1 的 a2 次方(對應元素) | [1?, 2?, 3?] ?→ [1,32,729] |
7. 矩陣和向量積(線性代數核心)
比如游戲里的 3D 建模、圖形旋轉,或是數據分析里的 “矩陣運算”,用這些函數不用手動算矩陣乘法(超容易錯)。
最常用的是np.matmul(a,b)
(矩陣乘法),比如:
# 定義一個2行3列的矩陣a,一個3行2列的矩陣b
a = np.matrix([[1,2,3], [4,5,6]]) # 2行3列
b = np.matrix([[2,2], [3,3], [4,4]]) # 3行2列
np.matmul(a, b) # 結果是2行2列的矩陣:[[20,20],[47,47]]
8. 其他常用數學函數(零散但實用)
函數 | 大白話作用 | 例子 |
---|---|---|
np.sqrt(x) | 算平方根(√x) | np.sqrt(16) ?→ 4.0 |
np.square(x) | 算平方(x2) | np.square(3) ?→ 9.0 |
np.absolute(x) | 算絕對值(不管正負,取正數) | np.absolute(-5) ?→ 5.0 |
np.maximum(a1,a2) | 兩個數組對應元素取最大值 | a1=[1,3,5] ,a2=[2,2,6] ?→ [2,3,6] |
np.minimum(a1,a2) | 兩個數組對應元素取最小值 | 同上 → [1,2,5] |
三、NumPy 的 “數組操作”:索引和切片
數組是 NumPy 的 “核心道具”(叫Ndarray
),比如 “1 行 10 列的數組”(1 維)、“4 行 5 列的數組”(2 維,像 Excel 表格)、“3 層 4 行 5 列的數組”(3 維,像疊起來的 Excel 表格)。
要從數組里 “拿數據”,就需要 “索引”(按位置取單個值)和 “切片”(按范圍取多個值),規則和 Python 的列表(list
)很像,但更靈活。
1. 先搞懂 “維度” 和 “索引規則”
數組的 “維度” 就是 “有幾個方向”:
- 1 維數組:像一條直線,只有 “左右” 方向,索引只有 1 個(比如
a[0]
)。 - 2 維數組:像一張表格,有 “行” 和 “列” 方向,索引有 2 個(比如
a[行索引, 列索引]
)。 - 3 維數組:像一疊表格,有 “層”“行”“列” 方向,索引有 3 個(比如
a[層索引, 行索引, 列索引]
)。
重要提醒:所有索引都是從 “0” 開始的!比如 “第 1 行” 對應索引0
,“第 2 列” 對應索引1
。
2. 1 維數組:索引和切片(最簡單)
a = np.arange(10) # 生成1維數組:[0,1,2,3,4,5,6,7,8,9]
# 1. 索引:取單個值
a[1] # 取索引1的值 → 1(對應“第2個元素”)
a[[1,2,3]] # 取多個索引的值 → [1,2,3]# 2. 切片:按范圍取(語法:start:stop:step,即“起始:結束:步長”)
a[:5] # 從開頭取到索引4(不包含5)→ [0,1,2,3,4]
a[5:10] # 從索引5取到9 → [5,6,7,8,9]
a[0:10:2] # 步長2,隔一個取一個 → [0,2,4,6,8]
3. 2 維數組:索引和切片(像 Excel 表格)
# 生成2維數組:4行5列(4個行,每個行有5個元素)
a = np.arange(20).reshape(4, 5) # 結果:
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]]# 1. 索引:取單個值(行索引, 列索引)
a[1, 2] # 第2行(索引1)、第3列(索引2)→ 7# 2. 切片:按范圍取(行范圍, 列范圍)
a[0:3, 2:4] # 行取0-2(前3行),列取2-3(第3-4列)→
# [[ 2 3]
# [ 7 8]
# [12 13]]a[:, ::2] # 行取所有(:代表所有),列步長2 →
# [[ 0 2 4]
# [ 5 7 9]
# [10 12 14]
# [15 17 19]]
4. 3 維數組:索引和切片(像疊起來的 Excel)
# 生成3維數組:2層、5行、3列(2個表格,每個表格5行3列)
a = np.arange(30).reshape(2, 5, 3) # 結構:
# 第0層:
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]
# [12 13 14]]
# 第1層:
# [[15 16 17]
# [18 19 20]
# [21 22 23]
# [24 25 26]
# [27 28 29]]# 索引:取單個值(層索引, 行索引, 列索引)
a[0, 1, 2] # 第0層、第2行、第3列 → 5
a[[0,1], [1,2], [1,2]] # 取兩個值:(0層1行1列)和(1層2行2列) → [4,23]
四、數組的 “排序、搜索、計數”(整理數據常用)
拿到一堆雜亂的數據,比如 “100 個隨機數”,需要 “排序”“找最大值位置”“算有多少個非 0 數”,用這些函數很快。
1. 排序:np.sort()
# 生成4行5列的隨機數數組
a = np.random.rand(20).reshape(4, 5) # 隨機數在0-1之間
np.sort(a) # 默認按“最后一個軸”排序(2維數組按“列”排序)
np.sort(a, axis=0) # 按“行”排序(即每一列從上到下排)
2. 搜索:找 “最大 / 最小 / 非 0” 元素的位置
# 生成20個0-9的隨機整數
a = np.random.randint(0, 10, 20) # 比如結果:[3,5,0,7,2,5,0,9,1,4]np.argmax(a) # 找最大值的索引 → 7(因為最大值9在索引7的位置)
np.argmin(a) # 找最小值的索引 → 2(最小值0在索引2的位置)
np.nonzero(a) # 找所有非0元素的索引 → (array([0,1,3,4,5,7,8,9]),)
3. 計數:算 “非 0 元素的數量”
np.count_nonzero(a) # 算數組里非0元素有多少個 → 上面的例子里有8個非0元素
五、總結:小白怎么上手 NumPy?
- 先裝 NumPy:打開命令行,輸入
pip install numpy
(如果沒裝 Python,先裝 Python)。 - 每次用前導入:代碼開頭寫
import numpy as np
(np
是大家約定俗成的簡稱,方便打字)。 - 先練 “數組操作”:從 1 維數組的索引、切片開始,再試 2 維,熟悉 “索引從 0 開始” 和 “維度分隔用逗號”。
- 遇到數學問題查函數:不用死記,比如要 “算總和” 就搜 “NumPy 求和”,要 “四舍五入” 就搜 “NumPy 四舍五入”,用多了自然就熟了