NumPy 实用文档
文章目录
- NumPy 实用文档
- 一、Numpy基础操作
- 1. 数组创建(Array Creation)
- 2. 随机数生成(Random)
- 3. 数组形状操作(Shape Manipulation)
- 4. 数组连接(Concatenate & Stack)
- 5. 广播机制(Broadcasting)
- 6. 向量化运算(Vectorized Operations)
- 7. 线性代数(Linear Algebra)
- 8. 统计函数(Statistics)
- 9. 类型转换(Type Casting)
- 10. 索引 / 切片 / 掩码(Indexing & Masking)
- 二、深度学习常用操作
- 11. 数据预处理(Data Preprocessing)
- 12. 数学验证(Math Validation)
- 13. 手写前向 / 损失 / 数值梯度
- 14. NumPy ↔ PyTorch 互操作
- 15. 统计分析(Research Metrics)
这是一个NumPy 常用方法的代码示例汇总,旨在帮助对各类 NumPy 操作有个基本印象,注释仅提供了运行结果与学习提示。(文档长期保持更新,欢迎补充)
如需了解更完整的参数说明、边界行为或扩展功能,建议参考官方文档:NumPy reference — NumPy v2.3 Manual,也可以直接向 ChatGPT 等工具咨询相关细节。
一、Numpy基础操作
1. 数组创建(Array Creation)
importnumpyasnp a=np.array([[1,2,3],[4,5,6]])# 输出:# [[1 2 3]# [4 5 6]]zeros=np.zeros((2,3))# 输出:# [[0. 0. 0.]# [0. 0. 0.]]ones=np.ones((2,3))# 输出:# [[1. 1. 1.]# [1. 1. 1.]]arange_arr=np.arange(0,10,2)# 输出: [0 2 4 6 8]linspace_arr=np.linspace(0,1,5)# 输出: [0. 0.25 0.5 0.75 1. ]2. 随机数生成(Random)
rand=np.random.rand(2,3)# 输出为 0~1均匀分布的随机数,默认float64# [[0.12 0.88 0.56]# [0.77 0.32 0.45]]randn=np.random.randn(2,3)# 输出为标准正态分布随机数,形状为(2,3)randint=np.random.randint(0,10,(2,3))# 输出 0~9 的整数矩阵np.random.seed(42)# 设置种子,之后np.random的同一命令对应同一数组fixed_rand=np.random.rand(2,2)# 固定输出:# [[0.37454012 0.95071431]# [0.73199394 0.59865848]]3. 数组形状操作(Shape Manipulation)
reshaped=a.reshape(3,2)# 输出:# [[1 2]# [3 4]# [5 6]]transposed=a.T# 输出:# [[1 4]# [2 5]# [3 6]]expanded=np.expand_dims(a,axis=1)# 在索引第1轴插入大小为1的新轴# 输出形状: (2, 1, 3)squeezed=np.squeeze(expanded)# 删除所有大小为1的轴# 输出形状: (2, 3)注意理解ndarray数组的轴的概念。
4. 数组连接(Concatenate & Stack)
b=np.array([[7,8,9],[10,11,12]])vstack=np.concatenate((a,b),axis=0)# 输出:# [[ 1 2 3]# [ 4 5 6]# [ 7 8 9]# [10 11 12]]hstack=np.concatenate((a,b),axis=1)# 输出:# [[ 1 2 3 7 8 9]# [ 4 5 6 10 11 12]]5. 广播机制(Broadcasting)
x=np.array([[1],[2],[3]])# shape (3,1)y=np.array([10,20,30])# shape (3,)result=x+y# 广播后结果:# [[11 21 31]# [12 22 32]# [13 23 33]]在 ndarray 的逐元素运算中,广播机制会逻辑上将数组扩展为兼容形状,使其可以与其他数组对齐参与计算。这种扩展是虚拟的,并不在内存中产生完整的复制数组,而是通过重复引用原数组的数据实现计算。
6. 向量化运算(Vectorized Operations)
v=np.array([1,2,3,4])v_sq=v**2# 输出: [ 1 4 9 16]v_exp=np.exp(v)# 输出: [ 2.718 7.389 20.085 54.598]v_sin=np.sin(v)# 输出约: [0.841 0.909 0.141 -0.757]大多为逐元素运算。
7. 线性代数(Linear Algebra)
M=np.array([[1,2],[3,4]])v2=np.array([1,2])M @ v2# 传统代码习惯使用np.dot(M,v2)# 输出: [5 11]np.linalg.inv(M)# 输出逆矩阵:# [[-2. 1. ]# [ 1.5 -0.5]]np.linalg.norm(M)# 输出矩阵的Frobenius范数# 即所有矩阵元素的平方和的平方根# 输出约:5.477(\sqrt{30})注意理解ndarray形状和矩阵运算的对应关系。
8. 统计函数(Statistics)
arr=np.array([1,2,3,4,5])np.mean(arr)# 3.0np.var(arr)# 方差=2.0np.std(arr)# 标准差≈ 1.414np.sum(arr)# 15np.min(arr)# 1np.max(arr)# 59. 类型转换(Type Casting)
arr.astype(np.float32)# 输出: dtype=np.float32 的数组10. 索引 / 切片 / 掩码(Indexing & Masking)
# 定义二维数组 aa=np.array([[1,2,3],[4,5,6]])# 切片操作slice_arr=a[:,1:]# ":" 表示取所有行; "1:" 表示从第1列到最后一列# 输出:# [[2 3]# [5 6]]注意学习多维数组的切片操作。
# 定义数组 arrarr=np.array([1,2,3,4,5])# 布尔掩码操作mask=arr[arr%2==0]# 输出: [2 4]注意学习多维数组的掩码操作,比如元素掩码平铺为一维输出,或者逐行掩码多维输出。
二、深度学习常用操作
11. 数据预处理(Data Preprocessing)
x=np.random.rand(5,3)# 默认float64np.save("demo.npy",x)# 将ndarray数组保存为npy文件x_loaded=np.load("demo.npy")# 解析npy文件,得到保存的ndarray数组x_fp32=x_loaded.astype(np.float32)# 数据统一转换为 float32 是常见操作x_std=(x_fp32-x_fp32.mean())/(x_fp32.std()+1e-6)# 标准化后:mean ≈ 0; std ≈ 1# 添加1e-6小量,防止分母为0# 由于PyTorch的卷积层要求输入格式为 NCHWimg=np.random.rand(32,32,3)# HWC格式img_chw=img.transpose(2,0,1)# 重排为CHW格式# 输出形状: (3, 32, 32)注意:
.npy文件是存一个 ndarray 的格式。
注意:建议了解有关图片数据的 HWC 存储格式,RGB润色。
12. 数学验证(Math Validation)
A=np.random.randn(3,3)b=np.random.randn(3)np.linalg.solve(A,b)# 输出:线性方程组 Ax=b 的解np.linalg.svd(A)[1]# 输出:A 的奇异值13. 手写前向 / 损失 / 数值梯度
x=np.random.randn(4)W=np.random.randn(3,4)*0.01b=np.zeros(3)h=W @ x+b relu=np.maximum(h,0)# 输出:ReLU 激活后的向量deff(w):# 假设的损失函数,参数为wreturn((w @ x)**2).sum()eps=1e-5# epsilon小量,即dwgrad_numeric=(f(W+eps)-f(W-eps))/(2*eps)# 输出:数值梯度,用于验证正确性推荐使用pytorch框架下的函数。
14. NumPy ↔ PyTorch 互操作
np_arr=np.random.randn(2,2).astype(np.float32)t=torch.from_numpy(np_arr)# 输出: torch.Tensor,其底层与 np_arr 共享内存np_back=t.numpy()# 输出: numpy.ndarray常用操作,pytorch张量用于构建计算图等,ndarray用于数据处理和文件存储。
15. 统计分析(Research Metrics)
pred=np.random.rand(100)gt=np.random.rand(100)err=np.linalg.norm(pred-gt)/(np.linalg.norm(gt)+1e-6)# 相对 L2 误差,例如: 0.41mean=pred.mean()std=pred.std()percentile_90=np.percentile(pred,90)# 均值,标准差,90分位数更多复杂的统计量可以用已有方法构建,也可以问gpt有无现成函数和方法。