【Python】不用numpy用纯python求极差、平均数、中位数、众数与方差,python的打印到控制台

2023-11-11

python作为数据分析的利器,求极差、平均数、中位数、众数与方差是很常用的,然而,在python进行统计往往要使用外部的python库numpy,这个库不难装,然而,如果单纯只是求极差、平均数、中位数、众数与方差,还是自己写比较好,因为,给一个.py程序别人的机器,别人的机器上没有python库numpy,又要别人折腾一番,这很不好。不过看情况咯,如果你要处理上亿级的数据,还是配置一下外部的python库numpy吧。

先给大家回归一下极差、平均数、中位数、众数与方差是什么鬼:

1、极差:最大值与最小值之差。它是标志值变动的最大范围。英文:range

公式:R=Xmax-Xmin(其中,Xmax为最大值,Xmin为最小值)

2、平均数:一组数据中所有数据之和再除以数据的个数。反映数据集中趋势的一项指标。英文:average

公式:

3、中位数:对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。英文:median

公式:从小到大排序为  则N为奇数时,N为偶数时, 

4、众数:众数是样本观测值在频数分布表中频数最多的那一组的组中值,主要应用于大面积普查研究之中。英文:mode

例如:1,2,3,3,4的众数是3。

但是,如果有两个或两个以上个数出现次数都是最多的,那么这几个数都是这组数据的众数。

例如:1,2,2,3,3,4的众数是2和3。

还有,如果所有数据出现的次数都一样,那么这组数据没有众数。

例如:1,2,3,4,5没有众数。

5、方差:方差是实际值与期望值之差平方的平均值,方差是在概率论和统计方差衡量随机变量或一组数据是离散程度的度量。英文:variance

公式:或者(就是在《概率论与数理统计》中那条,方差就是平方的期望-期望的平方)

因此,根据上述的理论,得到如下的代码:

[python]  view plain  copy
  1. #-*-coding:utf-8-*-  
  2. import time;  
  3. import random;  
  4. class Math:  
  5.     #求极差  
  6.     @staticmethod  
  7.     def range(l):  
  8.         return max(l)-min(l);  
  9.     #求平均数  
  10.     @staticmethod  
  11.     def avg(l):  
  12.         return float(sum(l))/len(l);  
  13.     #求中位数  
  14.     @staticmethod  
  15.     def median(l):  
  16.         l=sorted(l);#先排序  
  17.         if len(l)%2==1:  
  18.             return l[len(l)/2];  
  19.         else:  
  20.             return (l[len(l)/2-1]+l[len(l)/2])/2.0;  
  21.     #求众数  
  22.     @staticmethod  
  23.     def mode(l):  
  24.         #统计list中各个数值出现的次数  
  25.         count_dict={};  
  26.         for i in l:  
  27.             if count_dict.has_key(i):  
  28.                 count_dict[i]+=1;  
  29.             else:  
  30.                 count_dict[i]=1;  
  31.         #求出现次数的最大值  
  32.         max_appear=0  
  33.         for v in count_dict.values():  
  34.             if v>max_appear:  
  35.                 max_appear=v;  
  36.         if max_appear==1:  
  37.             return;  
  38.         mode_list=[];  
  39.         for k,v in count_dict.items():  
  40.             if v==max_appear:  
  41.                 mode_list.append(k);  
  42.         return mode_list;  
  43.     #求方差  
  44.     @staticmethod  
  45.     def variance(l):#平方的期望-期望的平方  
  46.         s1=0;  
  47.         s2=0;  
  48.         for i in l:  
  49.             s1+=i**2;  
  50.             s2+=i;  
  51.         return float(s1)/len(l)-(float(s2)/len(l))**2;  
  52.       
  53.     #求方差2  
  54.     @staticmethod      
  55.     def variance2(l):#平方-期望的平方的期望  
  56.         ex=float(sum(l))/len(l);  
  57.         s=0;  
  58.         for i in l:  
  59.             s+=(i-ex)**2;  
  60.         return float(s)/len(l);      
  61.   
  62. #主函数,测试  
  63. arr=[1,2,3,2,3,1,4];  
  64. print "极差为:{0}".format(Math.range(arr));  
  65. print "平均数为:{0:.2f}".format(Math.avg(arr));  
  66. print "中位数为:{0}".format(Math.median(arr));  
  67. print "众数为:{0}".format(Math.mode(arr));  
  68. print "方差为:{0:.2f}".format(Math.variance(arr));  
  69. print "方差为:{0:.2f}".format(Math.variance2(arr));  
  70.   
  71. print;  
  72.   
  73. #性能测试  
  74. arraylist=[];  
  75. for i in range(1,1000000):  
  76.     arraylist.append(i);  
  77. random.shuffle(arraylist);  
  78. time_start=time.time();  
  79. print "方差为:{0:.2f}".format(Math.variance(arraylist));  
  80. time_end=time.time();  
  81. print "{0}s".format(time_end-time_start);  
  82. time_start=time.time();  
  83. print "方差为:{0:.2f}".format(Math.variance2(arraylist));  
  84. time_end=time.time();  
  85. print "{0}s".format(time_end-time_start);  

运行结果如下:


关于这个程序有几点说明的:

(1)开头引入time与random主要是为了最后部分测试两种求方差的方式那种性能较优使用,一般情况下使用上述我自定义的Math类,无须引入任何python包。

(2)求任何一个统计量,用到除法,注意先将int先转float,否则精度损失严重,你是得到不到最后的正确答案的。

(3)python中自带有求list所有元素之和的sum,求list中的最值max,min,对list中的元素进行从小到大的排序sort()都用了,其余只能让我们自己现实了。

(4)这里无须考虑如果形式参数被传入一个字符串数组怎么办,因为这些工具类都是我们自己使用了,自己控制好要传递的数值,无须考虑这么多。

(5)求众数最艰难,因为用不到任何python自带的方法,还要返回一个list,因为众数的个数不定,统计数组中出现次数最多的数的时候,用到了python中的字典dict,《【Python】容器类》(点击打开链接),这个字典中,key是list中的数字,values是该数字出现的次数。然后要求出现次数的最大值,最后再求出改最大值对应的key。其中用count_dict.items()返回字典中的key-value对的数组集,count_dict.values()返回字典中的value集,当然同时也有count_dict.keys()返回key集。

(6)由于求方差的方法有两种,此程序在最后部分生成了一个百万级、打乱顺序的list,对两种求方差的方法进行测试,令人吃惊的是,万万没想到是我们愚蠢的人类最不爱用,也最难用的,最不好用的平方-期望的平方的期望,优于更好记忆的、更常用的平方的期望-期望的平方:。。从上述的运行结果可以看出这种求方差的方法速度是的一倍!这就是聪明的计算机与愚蠢的人类的区别吧~

(7)最后,python的打印到控制台,其实你完全可以print得更好的,你不换行还要在print后面补逗号吗,再print一个什么东东,或者将数值用str先转字符串才能与纯正的字符串连接起来,而字符串的format方法,配合print相当于C语言的printf,同时python的format用{0},{1}...代表后面的第0、1……参数。{0:.2f}代表这个参数以保留2位小数的方式输出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】不用numpy用纯python求极差、平均数、中位数、众数与方差,python的打印到控制台 的相关文章

  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • 在本地网络上运行 Bokeh 服务器

    我有一个简单的 Bokeh 应用程序 名为app py如下 contents of app py from bokeh client import push session from bokeh embed import server do
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐

  • mina服务器学习

    http bsr1983 iteye com blog 1880134
  • IDEA+Maven的JAVA开发环境配置

    本文记录了在windows上配置Hadoop Java开发环境的全过程 本次实验使用系统为Win10 其中Maven的安装位置为D 程序文件 源代码 Java apache maven 3 8 4 bin apache maven 3 8
  • token的生成与验证

    写在前面 最近在写自己毕业的东西 由于采用的是前后端分离的写法 为了方便写使用的是跨域的模式 所以cookie session就不好用了 所以记录一下token吧 夜太深了 就简单写一下用法吧 官方文档写的很全了 使用场景 用户成功登陆之后
  • 互联网业务全球化互通组网

    随着互联网业务的快速发展 越来越多的企业开始全球化扩张业务 并需要在全球范围内建立互联网组网以实现业务数据的高效传输 在这个过程中 如何建立高效 稳定的全球互联网组网方案 是每个企业都需要考虑的问题 一种可行的方案是使用云网络加速服务 例如
  • shell中打印带有时间的日志的命令(转)

    echo date Y m d H M S logadm on date Y m d H M S 2013 09 30 11 42 48 logadm on 20130930114248 转载于 https www cnblogs com
  • mobile.php discuz,电脑访问discuz手机版【触屏版跳转标准版的修改方法】

    推荐方法 以前我们介绍过如何通过修改Chrome浏览器运行参数的方法来模拟手机访问网站 但是在Chrome 32和33版本以后增加了更加便捷的方法 在开发者工具中只需要设置一下就能方便的模拟各种手机型号的访问效果了 方法如下 1 打开Chr
  • 作用域【python-4】

    file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大一在读的技术彩笔 brief python小白入门笔记 copyright 2022 8 COPYRIGHT 原创技术
  • windows脚本 批量删除指定文件夹、指定文件

    前言 用于批量删除项目中的测试数据 提供用户纯净的软件 使用说明 修改file list和folder list对应的数据 来自定义删除的内容 效果图 源码 echo off chcp 65001 gt nul 2 gt 1 REM 设置文
  • Errors accessing files.There may be spaces in your image‘s filename (已解决)

    一 问题 最近要做一个识别身份证的 然后就拷贝改代码 用到了Tesseract OCR 没想到出了这问题 说我文件名有空格 但是我这边确实没有啊 二 解决 上面框起来的地方是语言包 我想了想一般下载的时候好像没有相关的连带下载 然后去文件夹
  • Python3,爬虫的HTTP Error、URL Error及混合使用

    爬虫常出现的两种error URL Error HTTP Error HTTP Error 和URL Error 混合使用 URL Error url error 很常见的 就是url地址不正确 或者失效 我们来看看 代码是怎么实现的 co
  • 服务器被攻击了怎么处理?

    服务器若是被黑客或是攻击小组攻击 不同的机房会做出不同的策略调整 封机处理 一般2小时解封 最迟24小时 若是解封后仍然有攻击 则封机时间会增加24 48 72H 再安全的服务器也避免不了网络的攻击 作为一个网络安全运维人员需要做到维护好系
  • SD卡寄存器及对应的CMD命令描述

    目录 1 SD卡寄存器 1 1操作条件寄存器 OCR 1 2卡识别寄存器 CID 1 3特定数据寄存器 CSD 1 4相对地址寄存器 RCA 1 5驱动阶段寄存器 DSR 1 6SD配置寄存器 SCR 1 7SD状态寄存器 SSR 1 8卡
  • signature=5e1766d4239e5ac6aef18e8849a2555c,checksum.xml

    4FD71D2654435626B5FC1D5FB47809D322D9AC3AEDE1A45D1A45070B1820C922522C7D1586CD1C074F3F27D9E73C8F51F554AEE0F07A08ECB6593CAF
  • One-Way Conveyors 【Tarjan缩点+树链剖分】

    One Way Conveyors Aizu 1408 这道题上面推荐大家把maxN开的大一点 不然会RE 我倒是被这个坑了一下 还有一些细节 我将在后面徐徐道来 目前最快还是比较的开心 先讲一下题意 有N个点 M条无向边 然后输入这M条无
  • 回顾与展望

    原文链接 点击打开链接 摘要 8月14日启动 历时130天 全球AI届最大盛事之一 来自65个国家上万名选手参与的首届 AI Challenger全球AI挑战赛 在12月21日落下帷幕 AI Challenger视觉和翻译两大类共五个赛道
  • java快速开发框架---JavaBoot

    基于SpringBoot2倾情打造 面向所有层次的Java开发者 零门槛开箱即用的后台快速开发解决方案 1 系统环境 我们采取了Java EE 8 Servlet 3 0 Apache Maven 3作为环境开发的一套后台的系统 入门快 2
  • 【SSA-LSTM】基于麻雀算法优化LSTM 模型预测研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 麻雀搜索算法 1 2 长短期记忆神经网络 2 运行结果 3 参考文献 4 Matlab代码实现 1
  • x86架构芯片启动过程分析

    1 上电启动顺序 上电自检 读取ROM里的bios程序 bios程序会进行硬件检测 比如 内存 硬盘 显卡等 bios完成自检后 需要选择引导设备 比如设备上有U盘 SSD eMMC 机械硬盘 bios需要知道从哪个启动介质去启动计算机 b
  • (android地图开发) 高德地图自定义对话框

    截图效果 布局文件
  • 【Python】不用numpy用纯python求极差、平均数、中位数、众数与方差,python的打印到控制台

    python作为数据分析的利器 求极差 平均数 中位数 众数与方差是很常用的 然而 在python进行统计往往要使用外部的python库numpy 这个库不难装 然而 如果单纯只是求极差 平均数 中位数 众数与方差 还是自己写比较好 因为