Python数据分析(五):NumPy综合案例实战 目录案例1温度分析案例2成绩统计案例3矩阵计算案例4随机数据案例5数组变形案例6布尔索引案例7统计函数案例8缺失值处理案例9唯一值与排序在前面的章节中我们系统学习了 NumPy 的数组基础、数据类型、切片变形、广播机制以及常用的统计与比较 API为了将理论真正转化为实战能力本篇博客将通过9 个贴近真实数据分析场景的综合案例带大家手把手巩固 NumPy 的核心技能。案例1温度分析题目描述某城市连续一周的每日最高气温℃记录如下 [28, 30, 29, 31, 32, 30, 29]请编写代码完成以下分析任务计算这周的平均气温、最高气温以及最低气温找出这周内气温严格超过 30℃ 的天数思路解析这是一道经典的数据分析入门统计题目考察了 NumPy 数组的创建、基础聚合函数以及布尔索引的使用基础统计计算将原生 Python 列表转换为 ndarray 结构直接调用 NumPy 的聚合统计 API均值 .mean()、最大值 .max() 和最小值 .min()条件计数逻辑在 NumPy 中对数组应用比较运算符如 temps 30会返回一个布尔型数组即满足条件的对应位置为 True不满足为 False在 Python/NumPy 中True 被当作 1False 被当作 0。因此直接对布尔数组调用 np.sum() 即可极速统计出满足条件的总天数无需编写传统的 for 循环与 if 判断代码示例import numpy as np temps np.array([28, 30, 29, 31, 32, 30, 29]) mean_temp temps.mean() max_temp temps.max() min_temp temps.min() days (temps 30).sum() # 4. 打印分析结果 print(f平均气温: {mean_temp:.2f} ℃) print(f最高气温: {max_temp} ℃) print(f最低气温: {min_temp} ℃) print(f气温超过 30℃ 的天数: {days} 天)输出结果案例2成绩统计题目描述某班级 5 名学生的数学成绩记录如下[85, 90, 78, 92, 88]请编写代码完成以下分析任务计算这 5 名学生成绩的平均分、中位数和标准差将成绩转换为百分比比例形式假设满分为 100 分即转换为 0 ~ 1 之间的浮点数比例思路解析本题考察了统计 API 的基本用法以及标量与数组的矢量化除法统计指标计算平均分调用 scores.mean() 或 np.mean(scores)中位数特别注意NumPy 的 ndarray 对象没有 .median() 方法必须使用np.median(scores)标准差调用 scores.std()。默认计算总体标准差ddof0若需计算样本标准差可指定 ddof1成绩比例转换利用 NumPy 的矢量化数除特性直接用数组除以100无需编写循环即可将所有分数一次性映射为百分比比例代码示例scores np.array([85, 90, 78, 92, 88]) mean_score scores.mean() median_score np.median(scores) # 注意使用 np.median() std_score scores.std() scores_ratio scores / 100 print(f平均分: {mean_score:.2f}) print(f中位数: {median_score:.1f}) print(f标准差: {std_score:.2f}) print(百分比比例成绩:, scores_ratio)输出结果案例3矩阵计算题目描述给定两个 2 * 2 的二维矩阵 A 与 B请编写代码完成以下运算计算矩阵加法 A B计算矩阵的逐元素乘法A * B计算 A 与 B 的矩阵乘法思路解析本题旨在强化对比 NumPy 中逐元素运算与线性代数矩阵运算的区别矩阵加法 (A B)直接使用 运算符NumPy 会完成对应坐标元素的逐位相加逐元素乘法 (A * B)在 NumPy 中星号默认进行的是逐元素相乘即对应位置直接相乘矩阵乘法 (A B)真正的线性代数矩阵乘法需要使用 运算符。第一行第一列的计算规则为 1 * 5 2 * 7 19代码示例A np.array([[1, 2], [3, 4]]) B np.array([[5, 6], [7, 8]]) print(A B:\n, A B) print(A * B:\n, A * B) print(A B:\n, A B)输出结果案例4随机数据题目描述请编写代码完成以下任务生成一个形状为 (3, 4) 的随机整数数组数值范围限制在区间 [0, 10) 内计算该矩阵每列的最大值以及每行的最小值将矩阵中的所有奇数替换为 -1思路解析本题考察了随机数生成、轴向聚合统计以及布尔索引条件替换随机数组生成使用np.random.randint即可直接生成指定形状的随机整数矩阵轴计算每列的最大值沿着 Axis 0垂直向下方向进行压扁坍塌调用arr.max(axis0)返回形状为 (4,) 的一维数组每行的最小值沿着 Axis 1水平向右方向进行压扁坍塌调用arr.min(axis1)返回形状为 (3,) 的一维数组奇数替换利用布尔索引 arr[arr % 2 ! 0] -1可以直接原地将所有满足奇数条件的元素修改为 -1代码示例arr np.random.randint(0, 10, size(3, 4)) print(原数组\n, arr) print(最大值, arr.max(axis0)) print(最小值, arr.min(axis1)) arr[arr % 2 ! 1] -1 print(替换后\n, arr)输出结果案例5数组变形题目描述请编写代码完成以下任务创建一个包含数字 1 ~ 12 的一维数组并将其重构为形状为 (3, 4) 的二维矩阵计算该矩阵每行的和以及每列的平均值将该二维矩阵重新展平恢复为一维数组思路解析本题考察了数组的连续生成、维度重构、轴向统计以及展平机制生成与变形np.arange(1, 13)生成 [1, 13) 左闭右开序列.reshape(3, 4)将包含 12 个元素的一维数组转重构为 3 行 4 列的二维矩阵轴向计算每行的和沿 Axis 1推进求和调用arr.sum(axis1)消去第 1 维返回形状为 (3,) 的一维数组每列的平均值沿 Axis 0 推进求均值调用arr.mean(axis0)消去第 0 维返回形状为 (4,) 的一维数组降维展平.flatten() 或 .ravel()均可将多维数组压缩降维为一维数组。flatten() 返回深拷贝副本ravel() 优先返回视图代码示例arr np.arange(1, 13) arr arr.reshape(3, 4) print(转换后\n, arr) print(每行的和, arr.sum(axis1)) print(每列的平均值, arr.mean(axis0)) arr arr.ravel() print(展平后\n, arr)输出结果案例6布尔索引题目描述请编写代码完成以下任务生成一个形状为 (5, 5) 的随机整数数组数值范围限制在区间 [0, 20) 内找出该数组中所有严格大于 10的元素将数组中所有大于 10 的元素统一替换为 0思路解析本题旨在强化对布尔索引的理解生成随机矩阵使用np.random.randint(0, 20, size(5, 5))生成 5 * 5 的随机整数矩阵提取特定元素arr 10 会生成一个同形状的布尔矩阵符合条件的位置为 True其余为 False将该布尔矩阵作为索引传入原数组即 arr[arr 10]即可将所有满足条件的值过滤出来返回一个一维数组原地条件替换利用布尔索引的赋值机制直接编写 arr[arr 10] 0NumPy 会在底层将所有 True 对应的内存位置一次性修改为 0无需任何显式循环代码示例arr np.random.randint(0, 21, size(5, 5)) print(原数组\n, arr) print(大于10的元素, arr[arr 10]) arr[arr 10] 0 print(替换后\n, arr)输出结果案例7统计函数题目描述某公司连续 6 个月的销售额万记录如下 [120, 135, 110, 125, 130, 140]请编写代码完成以下分析任务计算这 6 个月销售额的总和、算术平均值以及方差找出销售额最高和最低分别对应的是第几个月思路解析本题考察了聚合统计以及索引定位的应用基础统计量计算 直接使用 NumPy 数组的聚合方法 .sum()总和、.mean()算术平均值与 .var()方差位置定位题目要求找出最高和最低销售额对应的月份即元素所在的位置而非仅仅取出数值本身在 NumPy 中寻找极值对应的索引位置需使用np.argmax()最大值索引与np.argmin()最小值索引由于 Python 数组索引是从 0 开始的如第 1 个月对应索引 0因此实际月份需要在求出的索引基础上 1代码示例sales np.array([120, 135, 110, 125, 130, 140]) print(销售总和, sales.sum()) print(销售均值, sales.mean().round(2)) print(销售方差, sales.var().round(2)) print(销售额最高月份, sales.argmax() 1) print(销售额最低月份, sales.argmin() 1)输出结果案例8缺失值处理题目描述给定一个包含缺失值np.nan的一维数组 [1, np.nan, 3, np.nan, 5]请编写代码完成以下任务计算数组中非缺失值的数量将数组中的所有缺失值替换为 0思路解析本题考察了对缺失值 np.nan 的识别、逻辑取反运算符以及布尔索引条件赋值的使用缺失值检测在 NumPy 中由于 np.nan np.nan 返回 False绝不能通过等号来直接判断缺失值必须使用np.isnan(arr)它会返回一个同形状的布尔数组True 代表对应位置是 NaN非缺失值计数使用按位非运算符 ~即 ~np.isnan(arr)即可将 NaN 位置转为 False有效数值位置转为 True。对该布尔数组调用 .sum()即可计算出非缺失值的总个数缺失值条件替换直接利用布尔索引arr[np.isnan(arr)] 0可以将所有为 NaN 的元素一次性原地重置替换为 0代码示例arr np.array( [1, np.nan, 3, np.nan, 5]) print(原始数组\n, arr) print(非缺失值数量, len(arr[~np.isnan(arr)])) arr[np.isnan(arr)] 0 print(替换后, (arr))输出结果案例9唯一值与排序题目描述给定一个包含重复元素的一维数组 [2, 1, 2, 3, 1, 4, 3]请编写代码完成以下任务找出数组中的所有唯一值并按从小到大的顺序进行排序计算每个唯一值在原数组中出现的次数思路解析本题考察了用于处理重复数据与频率统计的 APInp.unique()提取唯一值与排序调用 np.unique(arr)NumPy 会自动剔除数组中的重复元素并默认将结果按照从小到大的顺序升序排列无需额外调用 .sort()。频次统计设置参数return_countsTrue该函数会以元组形式返回两个一维数组第一个数组去重且排序后的唯一值第二个数组对应唯一值在原数组中出现的频次代码示例arr np.array([2, 1, 2, 3, 1, 4, 3]) unique, counts np.unique(arr, return_countsTrue) print(排序后的唯一值, unique) print(唯一值出现的次数, counts) for val, count in zip(unique, counts): print(f数值 {val} 出现了 {count} 次)输出结果本章通过多个综合案例对 NumPy 的核心知识进行了全面实践包括数组创建、索引与切片、矩阵运算、统计分析、随机数据生成、布尔索引、数组拼接以及缺失值处理等内容进一步加深了对 NumPy 各项功能的理解也提升了利用数组解决实际问题的能力至此NumPy 系列正式学习完成。作为 Python 数据分析的基础库NumPy 为高效的数据存储与数值计算提供了坚实的支持也是后续学习 Pandas、Matplotlib 以及机器学习等内容的重要基础下一篇开始我们将正式进入Pandas的学习了解其核心数据结构以及表格数据处理的方法进一步迈入真正的数据分析实践

本月热点