NumPy 教程
NumPy 教程
NumPy(Numerical Python)是 Python 科学计算的基础库,提供了高性能的多维数组对象和丰富的数学运算函数。
本教程包含
- 基础篇:数组创建、属性、索引、切片
- 运算篇:算术运算、矩阵运算、广播机制
- 进阶篇:统计函数、线性代数、随机数
为什么学习 NumPy
NumPy 是 Pandas、Matplotlib、Scikit-learn、TensorFlow 等所有 Python 数据科学库的基础。掌握 NumPy 是进入数据分析、机器学习和人工智能领域的必经之路。
学习准备
pip install numpyNumPy 简介
NumPy 简介
NumPy 是一个开源的 Python 科学计算库,于 2006 年发布,是 Python 数据科学生态的核心。
核心特性
- ndarray 数组:高性能的同质多维数组
- 广播机制:不同形状数组间自动运算
- 通用函数(ufunc):元素级快速运算
- 线性代数模块:linalg 子模块
- 随机数模块:random 子模块
- 与 C/Fortran 集成:底层用编译代码,性能接近原生
与 Python 列表对比
| 特性 | Python 列表 | NumPy 数组 |
|---|---|---|
| 存储类型 | 可混合类型 | 单一类型(同质) |
| 运算速度 | 慢(逐元素循环) | 快(向量化) |
| 内存占用 | 大(对象开销) | 小(紧凑连续) |
| 多维支持 | 嵌套列表 | 原生多维 |
NumPy 环境搭建
NumPy 环境搭建
安装 NumPy 非常简单,推荐使用 pip 或 conda 安装。
使用 pip 安装
pip install numpy
使用 conda 安装
conda install numpy
验证安装
import numpy as np
print(np.__version__) # 例如 1.26.4
推荐环境
- Anaconda:数据科学全家桶,自带 NumPy
- Jupyter Notebook / JupyterLab:交互式体验最佳
- VS Code + Python 扩展:轻量开发环境
常用导入约定
import numpy as np # 官方推荐别名 npNumPy 数组创建
NumPy 数组创建
创建数组是 NumPy 的基本操作,有十几种方式,这里介绍最常用的。
从列表创建
import numpy as np
a = np.array([1, 2, 3]) # 一维数组
b = np.array([[1, 2], [3, 4]]) # 二维数组
c = np.array([1, 2, 3], dtype=float) # 指定类型
特殊数组
np.zeros((2, 3)) # 全零数组
np.ones((2, 3)) # 全一数组
np.full((2, 2), 7) # 填充数组
np.eye(3) # 单位矩阵
np.empty((2, 2)) # 未初始化(随机值)
范围数组
np.arange(10) # [0 1 2 ... 9]
np.arange(1, 10, 2) # [1 3 5 7 9]
np.linspace(0, 1, 5) # 5 个等分点 [0 0.25 0.5 0.75 1]NumPy 数组属性
NumPy 数组属性
NumPy 数组(ndarray)有一组描述自身结构的属性。
核心属性
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
a.shape # 形状: (2, 3)
a.ndim # 维度数: 2
a.size # 元素总数: 6
a.dtype # 数据类型: int64
a.itemsize # 每个元素字节数: 8
a.nbytes # 总字节数: 48
a.T # 转置视图
修改形状
a.reshape(3, 2) # 重排为 3x2
a.flatten() # 展平为一维(复制)
a.ravel() # 展平为一维(视图)
a.resize(3, 2) # 原地修改形状
注意
- reshape 返回新视图,原数组不变
- flatten 返回副本,ravel 返回视图(修改会影响原数组)
- size = shape 各维度乘积
NumPy 数组索引
NumPy 数组索引
NumPy 支持与 Python 列表类似的下标索引,并扩展到多维和布尔索引。
基本索引
import numpy as np
a = np.array([10, 20, 30, 40])
a[0] # 10
a[-1] # 40
a[1:3] # [20 30]
b = np.array([[1, 2, 3], [4, 5, 6]])
b[1, 2] # 6 (第1行第2列)
b[0] # [1 2 3] (第0行)
负索引与切片
a[::-1] # 反转
b[:, 1:] # 所有行,第1列起
b[1, :] # 第1行全部
b[:, 0] # 第0列全部
注意
NumPy 切片返回的是视图(与原数组共享数据),修改视图会影响原数组。若需独立副本,使用 .copy()。
NumPy 数组切片
NumPy 数组切片
切片用于提取数组的子集,语法为 [start:stop:step]。
一维切片
import numpy as np
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
a[2:5] # [2 3 4]
a[:4] # [0 1 2 3]
a[5:] # [5 6 7 8 9]
a[::2] # 偶数位 [0 2 4 6 8]
a[1::2] # 奇数位 [1 3 5 7 9]
a[::-1] # 反转
二维切片
b = np.arange(12).reshape(3, 4)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
b[:2, 1:3] # 前两行、第1-2列
b[1:, :] # 从第1行开始的所有列
b[:, ::2] # 所有行、偶数列
重要特性:视图
sub = b[:2, :2]
sub[0, 0] = 99 # 会修改原数组 b!
print(b[0, 0]) # 99
切片是视图而非副本,修改会传导到原数组。想独立修改用 b[:2, :2].copy()。
NumPy 高级索引
NumPy 高级索引
高级索引允许用整数数组或布尔数组进行灵活的复杂选取。
整数数组索引
import numpy as np
a = np.array([10, 20, 30, 40, 50])
idx = np.array([0, 2, 4])
a[idx] # [10 30 50]
a[[1, 3]] # [20 40]
b = np.arange(12).reshape(3, 4)
b[[0, 2], [1, 3]] # (0,1)和(2,3)元素: [1, 11]
布尔索引
a = np.array([1, 2, 3, 4, 5])
mask = a > 3 # [False False False True True]
a[mask] # [4 5]
a[a % 2 == 0] # 偶数 [2 4]
# 条件赋值
a[a < 3] = 0 # 小于3的置0
注意
高级索引返回的是副本(与基本切片不同),修改不会影响原数组。
NumPy 数组运算
NumPy 数组运算
NumPy 的核心优势是向量化运算:对整个数组执行操作,无需循环。
算术运算
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
a + b # [5 7 9]
a - b # [-3 -3 -3]
a * b # [4 10 18] (对应元素相乘)
a / b # [0.25 0.4 0.5]
a ** 2 # [1 4 9]
np.sqrt(a) # 开方
标量运算(广播)
a + 10 # [11 12 13]
a * 2 # [2 4 6]
比较运算
a > 2 # [False False True]
np.all(a > 0) # True
np.any(a > 2) # True
注意
乘法 * 是元素级相乘,不是矩阵乘法。矩阵乘法用 @ 或 np.dot()。
NumPy 矩阵运算
NumPy 矩阵运算
NumPy 提供完整的线性代数运算,支持矩阵乘法、转置、求逆等。
矩阵乘法
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
A @ B # 矩阵乘法 (Python 3.5+)
np.dot(A, B) # 等价写法
np.matmul(A, B) # 等价写法
其他线性代数操作
np.transpose(A) # 转置 (A.T)
np.linalg.inv(A) # 求逆
np.linalg.det(A) # 行列式
np.linalg.eig(A) # 特征值与特征向量
np.linalg.solve(A, b) # 解线性方程组
内积与外积
v = np.array([1, 2, 3])
w = np.array([4, 5, 6])
np.inner(v, w) # 内积: 32
np.outer(v, w) # 外积: 3x3 矩阵NumPy 广播机制
NumPy 广播机制
广播(Broadcasting)让不同形状的数组能够进行算术运算,是 NumPy 强大且高效的特性。
广播规则
- 从后往前比较各维度
- 维度相同或其中一个为 1 时兼容
- 维度为 1 的会扩展匹配
常见场景
import numpy as np
# 数组 + 标量
a = np.array([1, 2, 3])
a + 10 # [11 12 13]
# 二维 + 一维(行广播)
m = np.arange(6).reshape(2, 3)
v = np.array([10, 20, 30])
m + v # 每行都加 v
# 二维 + 列向量(列广播)
c = np.array([[1], [2]])
m + c # 每列都加 c
广播示例图
形状 (2, 3) 与 (3,)
(2, 3) (2, 3)
(3,) -> (1, 3) -> 扩展为 (2, 3)
无法广播的情况
a = np.ones((3, 2))
b = np.ones((2, 3))
a + b # ValueError: 形状不兼容NumPy 数组操作
NumPy 数组操作
数组操作包括拼接、拆分、排序、去重等日常高频功能。
拼接
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.concatenate([a, b]) # [1 2 3 4 5 6]
np.hstack([a, b]) # 水平拼接
np.vstack([a, b]) # 垂直拼接 [[1 2 3],[4 5 6]]
m1 = np.array([[1, 2], [3, 4]])
m2 = np.array([[5, 6]])
np.append(m1, m2, axis=0) # 添加行
拆分
arr = np.arange(9)
np.split(arr, 3) # 3 等分
np.array_split(arr, 4) # 不均匀拆分
np.hsplit(m1, 2) # 水平拆分
排序与去重
arr = np.array([3, 1, 2, 3, 1])
np.sort(arr) # [1 1 2 3 3] (返回副本)
arr.sort() # 原地排序
np.unique(arr) # 去重 [1 2 3]
np.unique(arr, return_counts=True) # 带计数NumPy 数组复制与视图
NumPy 数组复制与视图
理解视图(View)与副本(Copy)的区别是避免 NumPy 陷阱的关键。
视图(View)
import numpy as np
a = np.arange(6)
v = a[2:5] # 切片 -> 视图
v[0] = 99
print(a) # [0 1 99 3 4 5] 原数组被修改!
副本(Copy)
c = a[2:5].copy() # 显式复制
c[0] = 0
print(a) # 原数组不受影响
判断是否共享内存
np.shares_memory(a, v) # True (视图)
np.shares_memory(a, c) # False (副本)
产生副本的常见操作
.copy():显式复制np.array(list):从列表新建a.astype(dtype):类型转换a.flatten():展平(副本)- 高级索引、布尔索引(副本)
经验法则
基本切片 → 视图;高级索引/类型转换/显式 copy → 副本。不确定时用 np.shares_memory 验证。
NumPy 数组类型转换
NumPy 数组类型转换
NumPy 数组有严格的数据类型(dtype),类型转换用 astype() 方法。
常见 dtype
import numpy as np
np.int8 / np.int16 / np.int32 / np.int64 # 整数
np.float16 / np.float32 / np.float64 # 浮点
np.bool_ # 布尔
np.complex64 / np.complex128 # 复数
np.str_ / np.unicode_ # 字符串
转换示例
a = np.array([1.5, 2.7, 3.2])
b = a.astype(np.int32) # [1 2 3] (截断)
c = a.astype("float32")
d = np.array([0, 1, 0]).astype(bool) # [False True False]
数组与列表互转
arr = np.array([1, 2, 3])
lst = arr.tolist() # [1, 2, 3]
back = np.array(lst)
注意事项
- float 转 int 直接截断小数部分,不做四舍五入
- 字符串转数字失败会抛异常或变 NaN
- astype 返回副本,原数组类型不变
NumPy 统计函数
NumPy 统计函数
NumPy 内置丰富的统计函数,用于描述数据的分布特征。
基本统计
import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6]])
np.min(data) # 最小值: 1
np.max(data) # 最大值: 6
np.sum(data) # 总和: 21
np.mean(data) # 平均值: 3.5
np.median(data) # 中位数: 3.5
np.std(data) # 标准差
np.var(data) # 方差
np.prod(data) # 乘积
指定轴统计
np.sum(data, axis=0) # 按列求和: [5 7 9]
np.sum(data, axis=1) # 按行求和: [6 15]
np.mean(data, axis=0) # 每列均值
累计与百分位
arr = np.array([1, 2, 3, 4, 5])
np.cumsum(arr) # 累计和: [1 3 6 10 15]
np.cumprod(arr) # 累计积
np.percentile(arr, 50) # 50% 分位(中位数)
np.percentile(arr, [25, 75]) # 四分位NumPy 随机数
NumPy 随机数
np.random 模块用于生成各种分布的随机数,是模拟和机器学习的基础。
均匀分布随机数
import numpy as np
np.random.seed(42) # 固定随机种子,结果可复现
np.random.rand(3, 2) # [0,1) 均匀分布 3x2
np.random.rand(5) # 一维 5 个
np.random.randint(1, 100, 10) # [1,100) 的 10 个整数
np.random.uniform(0, 1, 5) # 均匀分布
正态分布
np.random.randn(5) # 标准正态 N(0,1)
np.random.normal(0, 1, 1000) # 均值为0,标准差为1
其他分布与操作
np.random.binomial(10, 0.5, 100) # 二项分布
np.random.poisson(3, 100) # 泊松分布
np.random.shuffle(arr) # 原地打乱
np.random.choice([1, 2, 3], size=5, p=[0.1, 0.3, 0.6]) # 加权抽样
重要
训练模型或做实验时务必用 np.random.seed(n) 固定种子,保证结果可复现。
NumPy 线性代数
NumPy 线性代数
np.linalg 子模块提供了完整的线性代数函数,是科学计算的重要部分。
常用函数
import numpy as np
A = np.array([[3, 1], [1, 2]])
np.linalg.det(A) # 行列式: 5.0
np.linalg.inv(A) # 逆矩阵
np.linalg.matrix_rank(A) # 矩阵的秩
np.linalg.norm(A) # 范数(默认Frobenius)
np.linalg.eig(A) # 特征值/特征向量
np.linalg.eigvals(A) # 仅特征值
解线性方程组
# 3x + y = 9
# x + 2y = 8
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
x = np.linalg.solve(A, b)
print(x) # [2. 3.] -> x=2, y=3
矩阵分解
U, S, Vt = np.linalg.svd(A) # 奇异值分解
Q, R = np.linalg.qr(A) # QR 分解
L = np.linalg.cholesky(A) # Cholesky 分解(需正定)
SVD 在推荐系统、数据降维(PCA)中广泛使用。
NumPy 数组形状操作
NumPy 数组形状操作
重塑数组形状是数据预处理中的常见需求。
reshape
import numpy as np
a = np.arange(12)
b = a.reshape(3, 4) # 3行4列
c = a.reshape(2, 2, 3) # 三维
d = a.reshape(-1, 4) # -1 自动推断: 3x4
e = a.reshape(4, -1) # 4x3
展平与转置
m = np.arange(6).reshape(2, 3)
m.flatten() # [0 1 2 3 4 5] 副本
m.ravel() # 视图
m.T # 转置 3x2
np.transpose(m) # 等价
增加/删除维度
v = np.array([1, 2, 3])
v[np.newaxis, :] # (1, 3)
v[:, np.newaxis] # (3, 1)
np.expand_dims(v, 0) # (1, 3)
np.squeeze(m, 0) # 删除长度1的维度
维度交换与翻转
np.swapaxes(arr, 0, 1) # 交换两轴
np.flip(arr) # 全部翻转
np.flip(arr, axis=1) # 沿指定轴翻转NumPy 排序与搜索
NumPy 排序与搜索
NumPy 提供高效的排序和搜索函数,性能远超 Python 内置实现。
排序
import numpy as np
arr = np.array([3, 1, 2, 5, 4])
np.sort(arr) # [1 2 3 4 5] (返回副本)
arr.sort() # 原地排序
np.argsort(arr) # 排序索引 [1 2 0 4 3]
# 二维按列/行排序
m = np.array([[3, 1], [2, 4]])
np.sort(m, axis=0) # 每列排序 [[2 1],[3 4]]
np.sort(m, axis=1) # 每行排序 [[1 3],[2 4]]
搜索
arr = np.array([1, 3, 5, 7, 9])
np.where(arr > 4) # 满足条件的索引 (array([2,3,4]),)
np.where(arr > 4, arr, 0) # 条件替换
np.searchsorted(arr, 6) # 二分查找插入位置: 3
np.argmax(arr) # 最大值的索引: 4
np.argmin(arr) # 最小值的索引: 0
条件筛选
arr[arr > 4] # [5 7 9]
np.extract(arr > 4, arr) # 等价NumPy 字符串函数
NumPy 字符串函数
numpy.char 模块提供了向量化的字符串处理函数,可对字符串数组批量操作。
创建字符串数组
import numpy as np
names = np.array(["apple", "banana", "cherry"])
np.char.upper(names) # ['APPLE' 'BANANA' 'CHERRY']
np.char.lower(names)
np.char.capitalize(names) # 首字母大写
拼接与分割
np.char.add(["a", "b"], ["1", "2"]) # ['a1' 'b2']
np.char.join("-", ["ab", "cd"]) # ['a-b' 'c-d']
np.char.split("a-b-c", "-") # [['a' 'b' 'c']]
np.char.replace("hello world", "o", "0") # 'hell0 w0rld'
判断与查找
np.char.startswith(names, "a") # [True False False]
np.char.endswith(names, "y") # [False True False]
np.char.find("banana", "na") # 2
np.char.count("banana", "na") # 2
np.char.isalpha(names) # 是否全为字母
去空格
np.char.strip(" hello ") # 'hello'
np.char.lstrip(" hello")
np.char.rstrip("hello ")
注意:对纯文本处理,Pandas 的 str 方法更常用,NumPy 的 char 适合数组场景。
NumPy 文件读写
NumPy 文件读写
NumPy 支持多种文件格式的读写,包括二进制格式和文本格式。
二进制格式(.npy/.npz)
import numpy as np
arr = np.arange(10)
# 保存单个数组
np.save("arr.npy", arr)
loaded = np.load("arr.npy")
# 保存多个数组
np.savez("data.npz", a=arr, b=arr * 2)
d = np.load("data.npz")
d["a"] # 按名取回
# 压缩保存
np.savez_compressed("data_c.npz", a=arr, b=arr * 2)
文本格式
np.savetxt("data.txt", arr, delimiter=",") # 逗号分隔
np.savetxt("data.txt", arr, fmt="%.2f") # 格式控制
loaded = np.loadtxt("data.txt", delimiter=",")
data = np.genfromtxt("data.csv", delimiter=",", skip_header=1) # 跳过表头
适用场景
- 中间数据缓存:用 .npy(快、无损)
- 数据交换:用 CSV(通用、可读)
- 大规模科学数据:推荐 HDF5(需 h5py 库)
NumPy 通用函数
NumPy 通用函数
通用函数(ufunc)是对数组逐元素运算的函数,速度快且支持广播。
数学函数
import numpy as np
a = np.array([0, np.pi / 2, np.pi])
np.sin(a) # 正弦
np.cos(a) # 余弦
np.tan(a) # 正切
np.exp(a) # 指数
np.log(a) # 自然对数
np.log10(a) # 常用对数
np.abs([-1, 2]) # 绝对值
舍入函数
np.round(3.14159, 2) # 3.14
np.ceil(3.1) # 4.0 (向上取整)
np.floor(3.9) # 3.0 (向下取整)
np.rint(3.5) # 4.0 (四舍五入)
幂指函数
np.power(2, 10) # 1024
np.sqrt(16) # 4.0
np.square(5) # 25
np.sign([-2, 0, 3]) # [-1 0 1] 符号函数
通用函数的特性
- 支持广播:不同形状数组直接运算
- 支持
out参数:写入预分配数组 - 支持
where:条件运算 - 可组合:ufunc 之间可链式调用
NumPy 布尔运算与逻辑
NumPy 布尔运算与逻辑
NumPy 提供向量化的逻辑运算,用于数组的条件判断和掩码操作。
逻辑函数
import numpy as np
a = np.array([True, False, True])
b = np.array([True, True, False])
np.logical_and(a, b) # [True False False]
np.logical_or(a, b) # [True True True]
np.logical_not(a) # [False True False]
np.logical_xor(a, b) # [False True True]
条件判断
arr = np.array([1, 2, 3, 4, 5])
arr > 3 # [F F F T T]
(arr > 1) & (arr < 4) # 与(注意用 & 而非 and)
(arr > 4) | (arr < 2) # 或(用 | 而非 or)
全局判断
np.all(arr > 0) # 全部大于0: True
np.any(arr > 4) # 存在大于4: True
np.allclose(a, b) # 两数组是否近似相等(浮点容差)
掩码应用
mask = (arr >= 2) & (arr <= 4)
arr[mask] = 0 # 将 2-4 之间的元素置 0
print(arr) # [1 0 0 0 5]
重要
对 NumPy 数组做与/或必须用 & | ~,不能用 Python 的 and or not(会报错或产生错误结果)。
NumPy 线性代数应用
NumPy 线性代数应用
通过几个实际例子展示 NumPy 线性代数模块在现实场景中的应用。
示例:最小二乘拟合
import numpy as np
# 模拟数据 y = 2x + 1 + 噪声
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 1, 100)
# 构造设计矩阵 [x, 1]
X = np.column_stack([x, np.ones_like(x)])
# 最小二乘解
coef, _, _, _ = np.linalg.lstsq(X, y, rcond=None)
print(coef) # 接近 [2, 1]
示例:图像旋转
# 旋转矩阵
theta = np.radians(45)
R = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
point = np.array([1, 0])
rotated = R @ point # 旋转45度
示例:主成分分析(PCA)雏形
data = np.random.randn(50, 3) # 50个3维样本
centered = data - data.mean(axis=0)
cov = np.cov(centered.T) # 协方差矩阵
eigvals, eigvecs = np.linalg.eig(cov)
# 取最大特征值对应特征向量即第一主成分
pc1 = eigvecs[:, np.argmax(eigvals)]NumPy 性能优化
NumPy 性能优化
正确使用 NumPy 可以让数值计算提速几十到几百倍,关键是向量化。
避免 Python 循环
import numpy as np
import time
n = 10_000_000
a = np.random.rand(n)
# 慢:Python 循环
t0 = time.time()
total = 0
for v in a:
total += v
print(f"循环: {time.time() - t0:.3f}s")
# 快:向量化
t0 = time.time()
total = a.sum()
print(f"向量化: {time.time() - t0:.3f}s")
预分配内存
# 坏:循环中拼接数组
result = np.array([])
for i in range(1000):
result = np.append(result, i) # 每次都要复制
# 好:预分配
result = np.empty(1000)
for i in range(1000):
result[i] = i
使用 in-place 运算
a = np.random.rand(1000)
b = np.random.rand(1000)
a = a + b # 创建新数组
a += b # 原地修改,省内存(仅同 dtype 时安全)
其他技巧
- 用
np.where替代条件循环 - 合理使用
dtype:float32 比 float64 省一半内存 - 大数据集用
np.memmap内存映射
NumPy 与数据分析
NumPy 与数据分析
NumPy 是数据分析流水线的地基,几乎所有数据处理库都构建在它之上。
数据清洗基础
import numpy as np
data = np.array([1, 2, np.nan, 4, np.nan, 6])
np.isnan(data) # 检测缺失值
data[np.isnan(data)] = 0 # 填充缺失值
clean = data[~np.isnan(data)] # 删除缺失值
数据标准化
data = np.array([1, 2, 3, 4, 5])
mean = data.mean()
std = data.std()
normalized = (data - mean) / std # z-score 标准化
与 Pandas 配合
import pandas as pd
df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
arr = df.to_numpy() # DataFrame -> ndarray
new_df = pd.DataFrame(arr, columns=["a", "b"]) # ndarray -> DataFrame
与 Matplotlib 配合
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
plt.plot(x, np.sin(x))
plt.show()
典型数据分析流程
- NumPy 加载与预处理原始数据
- Pandas 做结构化清洗与聚合
- Matplotlib/Seaborn 可视化
- Scikit-learn 建模(内部依赖 NumPy 数组)
NumPy 总结与资源
NumPy 总结与资源
恭喜你完成了 NumPy 教程的学习!以下是全教程的知识总结与后续学习资源。
知识体系回顾
- 数组基础:创建(np.array/zeros/ones/arange/linspace)、属性、索引、切片、高级索引
- 运算:算术运算、矩阵运算(@/dot)、广播机制、通用函数
- 操作:形状重塑、拼接拆分、排序去重、复制与视图
- 统计与随机:min/max/mean/std、随机数生成、分布模拟
- 线性代数:det/inv/eig/svd/solve,最小二乘、PCA
- 输入输出:npy/npz 二进制、txt/csv 文本读写
- 性能:向量化、预分配、in-place 运算
后续学习路线
- Pandas:表格数据处理
- Matplotlib / Seaborn:数据可视化
- SciPy:科学计算高级功能
- Scikit-learn:机器学习
- TensorFlow / PyTorch:深度学习
官方资源
- NumPy 官方文档:numpy.org/doc
- NumPy 教程:官网 Tutorial 与 User Guide
- 在线练习:Kaggle、LeetCode(NumPy 专项)
记住:多用 arr.shape、arr.dtype 检查数组,遇到问题查官方文档,实践是最好的学习方式。