Python 求数组的中位数(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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]
  • 中间两个数为 8588,平均值为 86.5

总结

本文通过代码示例和理论分析,系统讲解了 Python 求数组的中位数 的方法。核心步骤包括:

  1. 排序数组,确保数据有序;
  2. 分奇偶情况计算中位数
  3. 使用标准库简化开发;
  4. 处理异常和复杂场景

掌握这一技能后,开发者可以更高效地分析数据,解决实际问题。建议读者通过动手编写代码、尝试不同数据集来加深理解。中位数不仅是统计学的基础工具,更是 Python 编程中不可或缺的实用技能。

最新发布