Python 求数组的中位数(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据分析、统计学和编程领域中,中位数是一个核心概念。它能够帮助我们快速理解一组数据的分布特征,尤其在处理异常值时比均值更稳健。对于 Python 开发者而言,掌握如何高效、准确地求数组的中位数,是解决实际问题的重要技能。本文将从基础概念出发,结合代码示例和实际案例,深入浅出地讲解这一主题,适合编程初学者和中级开发者阅读。
什么是中位数?
中位数(Median)是一组数据按大小顺序排列后,位于中间位置的数值。如果数据数量为奇数,则中位数是正中间的数;如果是偶数,则取中间两个数的平均值。例如:
- 奇数长度:数组
[1, 3, 5, 7, 9]
的中位数是5
。 - 偶数长度:数组
[2, 4, 6, 8]
的中位数是(4 + 6)/2 = 5
。
形象比喻:想象一群人按身高排队,中位数就是站在中间位置的人的身高。如果人数是偶数,中位数则是中间两个人的平均身高。
Python 求数组中位数的步骤
第一步:排序数组
中位数的计算依赖于有序的数据序列。因此,首先需要将数组排序。Python 中可以用 sorted()
函数或列表的 sort()
方法实现排序:
numbers = [5, 1, 9, 3, 7]
sorted_numbers = sorted(numbers) # 不改变原数组
print("排序后的数组:", sorted_numbers) # 输出:[1, 3, 5, 7, 9]
numbers.sort()
print("排序后的原数组:", numbers) # 输出:[1, 3, 5, 7, 9]
第二步:确定中位数的位置
根据数组的长度(n
)判断中位数的计算方式:
- 奇数长度:中位数位于索引
n//2
的位置。 - 偶数长度:取索引
(n//2 - 1)
和n//2
处的两个数的平均值。
注意:Python 中的索引从 0
开始,因此需要特别注意位置的计算。
自己实现中位数函数
接下来,我们将编写一个简单的 Python 函数来实现中位数的计算:
def calculate_median(arr):
sorted_arr = sorted(arr)
n = len(sorted_arr)
if n % 2 == 1:
# 奇数情况:直接取中间值
median = sorted_arr[n // 2]
else:
# 偶数情况:取中间两个数的平均值
mid1 = sorted_arr[(n // 2) - 1]
mid2 = sorted_arr[n // 2]
median = (mid1 + mid2) / 2
return median
test_data1 = [3, 1, 4, 1, 5, 9, 2]
print("中位数:", calculate_median(test_data1)) # 输出:4.0
test_data2 = [2, 4, 6, 8]
print("中位数:", calculate_median(test_data2)) # 输出:5.0
使用 Python 标准库简化代码
Python 的 statistics
模块提供了 median()
函数,可以一键计算中位数,无需手动编写逻辑:
import statistics
data = [5, 2, 8, 1, 9, 3]
median_value = statistics.median(data)
print("中位数:", median_value) # 输出:4.5
对比分析:
| 方法 | 优点 | 缺点 |
|--------------------|-----------------------------|-----------------------------|
| 手动实现函数 | 灵活,适合理解底层逻辑 | 代码冗长,易出错 |
| 使用 statistics.median()
| 代码简洁,无需关心实现细节 | 需要导入第三方模块 |
处理特殊场景:空数组和异常情况
在实际开发中,需要考虑数组为空的情况,避免程序崩溃。可以通过 try-except
块捕获错误:
def safe_median(arr):
try:
return statistics.median(arr)
except statistics.StatisticsError as e:
print(f"错误:{e}")
return None
empty_data = []
print("空数组的中位数:", safe_median(empty_data)) # 输出:错误:no median for empty data
扩展应用:多维数组与混合类型
如果数组包含嵌套结构(如二维数组),需要先将其“展平”后再计算中位数:
def flatten_array(arr):
"""将二维数组转换为一维数组"""
return [item for sublist in arr for item in sublist]
matrix = [[1, 2], [3, 4], [5, 6]]
flattened = flatten_array(matrix)
print("二维数组的中位数:", statistics.median(flattened)) # 输出:3.5
性能优化与算法复杂度
排序是计算中位数的必要步骤,其时间复杂度为 O(n log n)。对于大规模数据,可以考虑使用 快速选择算法(Quickselect),其平均复杂度为 O(n)。不过,Python 标准库的 statistics.median()
已经优化了性能,适合大多数场景。
实际案例:计算学生成绩的中位数
假设我们有一组学生的数学成绩,需要计算班级的中位数分数:
scores = [85, 92, 78, 90, 88, 76, 85, 95]
median_score = statistics.median(scores)
print(f"班级成绩的中位数为:{median_score}") # 输出:86.5
分析:
- 原始数据:
[76, 78, 85, 85, 88, 90, 92, 95]
- 中间两个数为
85
和88
,平均值为86.5
。
总结
本文通过代码示例和理论分析,系统讲解了 Python 求数组的中位数 的方法。核心步骤包括:
- 排序数组,确保数据有序;
- 分奇偶情况计算中位数;
- 使用标准库简化开发;
- 处理异常和复杂场景。
掌握这一技能后,开发者可以更高效地分析数据,解决实际问题。建议读者通过动手编写代码、尝试不同数据集来加深理解。中位数不仅是统计学的基础工具,更是 Python 编程中不可或缺的实用技能。