NumPy 使用指南
一、为什么选择 NumPy 而非 Python 列表Python 原生列表list虽能存储数组形式的数据但存在显著性能缺陷内存效率低列表存储的是对象指针即使存储简单数值如[0,1,2]也需要额外存储指针造成内存浪费计算速度慢列表元素分散存储遍历需频繁查找内存地址无法利用 CPU 矢量化指令并行计算差列表原生不支持多线程矩阵运算难以利用多核 CPU 资源。NumPy 解决了上述问题数组元素存储在连续的内存块中无需额外指针开销支持 CPU 矢量化指令计算效率远超列表内置多线程矩阵运算可充分利用硬件资源核心逻辑基于 C 语言实现避免 Python 解释器的性能损耗。优化技巧使用就地操作如x * 2替代隐式拷贝如y x * 2可使运算速度提升 2 倍以上。二、NumPy 核心对象NumPy 核心包含两个关键对象ndarrayN 维数组对象用于存储多维数据ufunc通用函数对象用于对数组元素进行高效运算。2.1 ndarray 多维数组核心概念秩rank数组的维数一维数组秩为 1二维数组秩为 2轴axes数组的维度方向例如二维数组的axis0代表列方向axis1代表行方向属性shape数组尺寸、dtype元素数据类型。创建基础数组import numpy as np # 创建一维数组 a np.array([1, 2, 3]) # 创建二维数组 b np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 修改数组元素下标从 0 开始 b[1,1] 10 # 查看数组属性 print(a 的尺寸, a.shape) # 输出 (3,) print(b 的尺寸, b.shape) # 输出 (3, 3) print(a 的数据类型, a.dtype) # 输出 int32/int64取决于系统 print(修改后的 b\n, b)输出结果a 的尺寸 (3,) b 的尺寸 (3, 3) a 的数据类型 int32 修改后的 b [[ 1 2 3] [ 4 10 6] [ 7 8 9]]结构数组自定义数据类型适用于存储结构化数据如学生信息、商品信息类似 C 语言的structimport numpy as np # 定义结构类型姓名字符串、年龄整型、语文/数学整型、英语浮点型 persontype np.dtype({ names: [name, age, chinese, math, english], formats: [S32, i, i, i, f] }) # 创建结构数组 peoples np.array([ (ZhangFei, 32, 75, 100, 90), (GuanYu, 24, 85, 96, 88.5), (ZhaoYun, 28, 85, 92, 96.5), (HuangZhong, 29, 65, 85, 100) ], dtypepersontype) # 提取指定字段并计算平均值 ages peoples[:][age] chineses peoples[:][chinese] maths peoples[:][math] englishs peoples[:][english] print(平均年龄, np.mean(ages)) print(平均语文成绩, np.mean(chineses)) print(平均数学成绩, np.mean(maths)) print(平均英语成绩, np.mean(englishs))输出结果平均年龄 28.25 平均语文成绩 77.5 平均数学成绩 93.25 平均英语成绩 93.752.2 ufunc 通用函数ufunc 是对数组元素进行批量操作的函数基于 C 语言实现运算速度极快。1. 连续数组创建函数用法说明arangenp.arange(起始, 终止, 步长)不包含终止值生成等差数组linspacenp.linspace(起始, 终止, 元素个数)包含终止值线性等分生成数组示例import numpy as np x1 np.arange(1, 11, 2) # 起始1终止11不含步长2 x2 np.linspace(1, 9, 5) # 起始1终止9含生成5个元素 print(x1, x1) # 输出 [1 3 5 7 9] print(x2, x2) # 输出 [1 3 5 7 9]2. 算术运算支持数组间的加、减、乘、除、次方、取余等运算import numpy as np x1 np.arange(1, 11, 2) x2 np.linspace(1, 9, 5) print(加法, np.add(x1, x2)) # [ 2. 6. 10. 14. 18.] print(减法, np.subtract(x1, x2)) # [0. 0. 0. 0. 0.] print(乘法, np.multiply(x1, x2)) # [ 1. 9. 25. 49. 81.] print(除法, np.divide(x1, x2)) # [1. 1. 1. 1. 1.] print(次方, np.power(x1, x2)) # [1.00000000e00 2.70000000e01 ...] print(取余, np.remainder(x1, x2)) # [0. 0. 0. 0. 0.]也可用 np.mod3. 统计函数函数功能示例二维数组a [[1,2,3],[4,5,6],[7,8,9]]amin(a, axis)计算指定轴的最小值np.amin(a)→ 1np.amin(a, 0)→ [1,2,3]np.amin(a,1)→ [1,4,7]amax(a, axis)计算指定轴的最大值np.amax(a)→ 9np.amax(a, 0)→ [7,8,9]np.amax(a,1)→ [3,6,9]ptp(a, axis)计算最大值与最小值的差极差np.ptp(a)→ 8np.ptp(a, 0)→ [6,6,6]np.ptp(a,1)→ [2,2,2]percentile(a, p, axis)计算第 p 百分位数p∈[0,100]np.percentile(a, 50)→ 5.0np.percentile(a,50,0)→ [4,5,6]median(a, axis)计算中位数np.median(a)→ 5.0np.median(a,0)→ [4,5,6]mean(a, axis)计算算术平均值np.mean(a)→ 5.0np.mean(a,0)→ [4,5,6]average(a, weights)计算加权平均值a[1,2,3,4], wts[1,2,3,4]→ 加权平均为 3.0std(a)计算标准差a[1,2,3,4]→ std≈1.118var(a)计算方差a[1,2,3,4]→ var1.25示例加权平均import numpy as np a np.array([1,2,3,4]) wts np.array([1,2,3,4]) print(算术平均, np.average(a)) # 2.5 print(加权平均, np.average(a, weightswts)) # 3.04. 排序np.sort(a, axis, kind)默认快速排序kindquicksort支持合并排序mergesort、堆排序heapsort。axisNone展平数组后整体排序axis0沿列排序axis1沿行排序默认。示例import numpy as np a np.array([[4,3,2],[2,4,1]]) print(默认排序axis1\n, np.sort(a)) # [[2 3 4],[1 2 4]] print(展平排序, np.sort(a, axisNone)) # [1 2 2 3 4 4] print(沿列排序axis0\n, np.sort(a, axis0)) # [[2 3 1],[4 4 2]] print(沿行排序axis1\n, np.sort(a, axis1)) # [[2 3 4],[1 2 4]]三、核心总结NumPy 优势相比 Python 列表NumPy 数组内存连续、支持矢量化运算和多线程计算效率大幅提升核心对象ndarray用于存储多维数组支持自定义结构ufunc用于数组的高效运算关键操作掌握数组的创建、算术运算、统计分析均值/方差/极差等、排序是 NumPy 应用的核心。