机器学习之Numpy(Machine Learning about Numpy)
发布时间:2026/9/29 15:05:51来源:尧图网络
二、NumPy数据处理1、Numpy基础与数组创建1.1 Numpy基础知识NumpyNumerical Python是Python编程语言里面用于数值计算的基础库它提供了高性能的多维数组对象 narray 以及一系列用于操作这类数组的工具函数。NumPy于2005年发布现如今已成为Python数据科学生态系统的核心组件。重要提示pandas、scipy、scikit-learn等主流数据处理库都是基于NumPy构建的。掌握NumPy就像掌握了数据分析的「内功心法」后续学习其他库将事半功倍。NumPy的核心特性包括向量化运算无需编写循环即可对整个数组进行数学运算。广播机制支持不同形状数组之间的运算。高效内存存储连续内存块存储访问速度快。丰富的数学函数库线性代数、傅里叶变换、随机数生成等。1.2 ndarray 与 Python列表对于Python列表与Numpy数组两者之间的关系让大多数初学者有些不解虽然看着并无差别但是通过特性回来看确实大不相同。NumPy数组元素类型必须同质运算方式向量化运算执行速度使用C语言作为底层速度快内存占用紧凑连续内存块维度支持原生N维数组功能丰富度多维运算、矩阵分解、统计聚合import numpy as np import time # Python列表循环求和 py_list list(range(1000000)) start time.time() py_sum sum(py_list) print(fPython列表求和耗时{time.time() - start:.4f}秒) # NumPy数组向量化求和 np_arr np.arange(1000000) start time.time() np_sum np_arr.sum() print(fNumPy数组求和耗时{time.time() - start:.4f}秒)1.3 创建数组的方式# NumPy库 import numpy as np # 方式1从Python列表转换最常用 a np.array([1, 2, 3, 4, 5]) print(f从列表创建{a}) # [1 2 3 4 5] # 方式2全0数组 zeros_1d np.zeros(5) # 一维5个元素 zeros_2d np.zeros((3, 4)) # 二维3行4列 print(f全0一维数组{zeros_1d}) # [0. 0. 0. 0. 0.] # 方式3全1数组 ones_1d np.ones(5) ones_2d np.ones((3, 4)) print(f全1二维数组\n{ones_2d}) # [[1. 1. 1. 1.] # [1. 1. 1. 1.] # [1. 1. 1. 1.]] # 方式4指定填充值的数组 full_arr np.full((2, 3), 7) # 2行3列全部填充7 print(f全7数组\n{full_arr}) # [[7 7 7] # [7 7 7]] # 方式5范围数组 arr1 np.arange(0, 10, 2) # 开始0结束10步长2 arr2 np.linspace(0, 1, 5) # 开始0结束1均匀切分5份 print(farange创建{arr1}) # [0 2 4 6 8] print(flinspace创建{arr2}) # [0. 0.25 0.5 0.75 1. ] # 方式6随机数组最常用 rand_uniform np.random.rand(3, 4) # 0~1均匀分布 rand_int np.random.randint(0, 10, (3, 4)) # 0~10整数随机 randn np.random.randn(3, 4) # 标准正态分布均值0方差1 print(f随机整数数组\n{rand_int})注意事项np.arange()的区间是左闭右开[start, stop)而np.linspace()是左闭右闭[start, stop]。1.4 数组的关键属性每个NumPy数组都有以下重要属性理解它们对于数组的操作可谓是必不可少a np.array([[1, 2, 3], [4, 5, 6]]) print(f形状 (shape){a.shape}) # (2, 3) - 2行3列 print(f维度数 (ndim){a.ndim}) # 2 - 二维数组 print(f数据类型 (dtype){a.dtype}) # int64 - 64位整数 print(f元素总数 (size){a.size}) # 6 - 共6个元素 print(f单个元素字节数 (itemsize){a.itemsize}) # 8 print(f数组总字节数 (nbytes){a.nbytes}) # 481.5 数据类型详解NumPy支持多种数据类型合理选择可以节省内存dtype说明字节数典型用途int3232位整数4一般整数运算int6464位整数8大数值统计float32单精度浮点4内存敏感场景float双精度浮点8精度要求高bool布尔类型1条件判断bojectPython对象可变混合类型存储# 指定数据类型 arr1 np.array([1, 2, 3], dtypenp.float32) arr2 np.array([1, 2, 3], dtypenp.float64) print(ffloat32内存{arr1.nbytes}字节) # 12 print(ffloat64内存{arr2.nbytes}字节) # 242、数组索引与切片2.1 一维数组索引基础NumPy数组的索引方式与 Python 列表类似但功能强大。索引基础规则正向索引从0开始a[0] 是第一个元素负向索引从-1开始a[-1] 是最后一个元素切片a[start:stop:step]遵循左闭右开原则a np.arange(10) # 创建 [0 1 2 3 4 5 6 7 8 9] print(f原数组{a}) # 正向索引 print(fa[0] {a[0]}) # 0 print(fa[5] {a[5]}) # 5 # 负向索引 print(fa[-1] {a[-1]}) # 9 print(fa[-3] {a[-3]}) # 7 # 切片操作 print(fa[2:7] {a[2:7]}) # [2 3 4 5 6] - 第3到第7个元素 print(fa[:5] {a[:5]}) # [0 1 2 3 4] - 从头到第5个 print(fa[5:] {a[5:]}) # [5 6 7 8 9] - 从第6个到末尾 # 步长切片 print(fa[::2] {a[::2]}) # [0 2 4 6 8] - 步长2 print(fa[::3] {a[::3]}) # [0 3 6 9] - 步长3 print(fa[::-1] {a[::-1]}) # [9 8 7 6 5 4 3 2 1 0] - 完全反转2.2 二维数组索引二维数组的索引需要同时指定行和列语法为 array[row, col]b np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) print(f原数组\n{b}) # 单个元素索引 print(fb[1, 2] {b[1, 2]}) # 6 - 第2行第3列 # 行索引 print(fb[0, :] {b[0, :]}) # [1 2 3] - 第1行所有列 print(fb[1] {b[1]}) # [4 5 6] - 第2行省略写法 # 列索引 print(fb[:, 1] {b[:, 1]}) # [2 5 8] - 第2列所有行 # 子矩阵切片 print(fb[0:2, 0:2] \n{b[0:2, 0:2]}) # [[1 2] # [4 5]] # 跳行跳列 print(fb[::2, ::2] \n{b[::2, ::2]}) # [[1 3] # [7 9]]2.3 布尔索引布尔索引是 NumPy 里面最强大的特征之一它允许我们根据条件筛选数组元素a np.array([10, 20, 30, 40, 50]) print(f原数组{a}) # 创建布尔掩码 mask a 30 print(fa 30 的掩码{mask}) # [False False False True True] # 使用掩码筛选 result a[mask] print(fa[a 30] {result}) # [40 50] # 一行写法最常用 print(fa[a 25] {a[a 25]}) # [30 40 50]核心应用场景在数据分析中布尔索引用于数据清洗、异常值检测、条件筛选等场景。实际应用# 场景筛选价格大于150的商品 prices np.array([99, 199, 299, 399, 149]) print(f高价商品价格{prices[prices 150]}) # [199 299 399] # 场景筛选成绩及格的学生 scores np.array([45, 78, 92, 63, 88, 55, 76]) print(f及格成绩{scores[scores 60]}) # [78 92 63 88 76] # 复合条件 a np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 找出大于3且小于8的数 result a[(a 3) (a 8)] print(f大于3且小于8{result}) # [4 5 6 7]注意在NumPy中进行复合条件筛选时必须使用按位与而不是andPython逻辑与因为NumPy操作的是数组而不是单个值。2.4 花式索引花式索引Fancy Indexing使用整数数组作为索引可以实现任意顺序、任意位置的元素选取a np.arange(10) # [0 1 2 3 4 5 6 7 8 9] # 使用整数数组指定索引位置 indices [0, 2, 4, 6] print(fa[{indices}] {a[indices]}) # [0 2 4 6] # 不按顺序选取 print(fa[[3, 0, 5]] {a[[3, 0, 5]]}) # [3 0 5] # 二维花式索引 b np.arange(12).reshape(3, 4) print(f原数组\n{b}) # 选取特定行 print(fb[[0, 2], :] \n{b[[0, 2], :]}) # 选取第1行和第3行因为下标从0开始所以是0和23、数组运算与聚合3.1 逐元素运算NumPy的核心优势之一是支持向量化运算无需循环即可对数组的每个元素进行数学运算a np.array([1, 2, 3, 4, 5]) # 基本算术运算 print(fa 10 {a 10}) # [11 12 13 14 15] print(fa - 5 {a - 5}) # [-4 -3 -2 -1 0] print(fa * 2 {a * 2}) # [2 4 6 8 10] print(fa / 2 {a / 2}) # [0.5 1. 1.5 2. 2.5] print(fa ** 2 {a ** 2}) # [1 4 9 16 25] print(fa % 2 {a % 2}) # [1 0 1 0 1] - 取模 # 比较运算布尔索引 print(fa 3 {a 3}) # [False False False True True] print(fa 3 {a 3}) # [False False True False False]向量化优势使用向量化运算比Python循环快10-100倍因为NumPy在底层使用了SIMD指令集优化。3.2 数组间运算两个形状相同的数组可以进行逐元素运算a np.array([1, 2, 3, 4]) b np.array([10, 20, 30, 40]) print(fa b {a b}) # [11 22 33 44] print(fa * b {a * b}) # [10 40 90 160] print(fb - a {b - a}) # [9 18 27 36]3.3 广播机制Boardcasting广播 NumPy 最强大的特征之一它允许不同形状的数组进行运算# 一维数组与二维数组广播 c np.array([ [1, 2, 3], [4, 5, 6] ]) d np.array([10, 20, 30]) print(fc d \n{c d}) # [[11 22 33] # [14 25 36]] # 标量与数组广播 print(fc * 2 \n{c * 2}) # [[2 4 6] # [8 10 12]]广播规则当两个数组的形状不同时NumPy会从后向前比较维度如果维度相同或其中一个为1则可以广播。3.4 聚合函数NumPy 提供了丰富的聚合函数用于统计计算arr np.array([1, 2, 3, 4, 5]) # 基本统计 print(f总和 sum {arr.sum()}) # 15 print(f均值 mean {arr.mean()}) # 3.0 print(f最大值 max {arr.max()}) # 5 print(f最小值 min {arr.min()}) # 1 print(f标准差 std {arr.std():.4f}) # 1.4142 print(f方差 var {arr.var():.4f}) # 2.0000 # 累积函数 print(f累加 cumsum {arr.cumsum()}) # [1 3 6 10 15] print(f累乘 cumprod {arr.cumprod()}) # [1 2 6 24 120]3.5 多维数组聚合轴向对于多维数组可以通过指定 axis 参数沿特定轴进行聚合m np.arange(12).reshape(3, 4) print(f原数组\n{m}) # 按列聚合axis0 print(f每列求和 (axis0){m.sum(axis0)}) #[12 15 18 21] # 按行聚合axis1 print(f每行求和 (axis1){m.sum(axis1)}) # [ 6 22 38] # 其他轴向聚合 print(f每列最大值{m.max(axis0)}) # [ 8 9 10 11] print(f每行平均值{m.mean(axis1)}) # [1.5 5.5 9.5]参数提示axis1表示行axis0表示列
网站建设高端定制企业官网