零基础小白的 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) |
算平方(x²) | 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 四舍五入”,用多了自然就熟了