Lesson5.3---Python 之 NumPy 统计函数、数据类型和文件操作

news2024/10/1 17:16:49

一、统计函数

  • NumPy 能方便地求出统计学常见的描述性统计量。
  • 最开始呢,我们还是先导入 numpy。
import numpy as np

1. 求平均值 mean()

  • mean() 是默认求出数组内所有元素的平均值。
  • 我们使用 np.arange(20).reshape((4,5)) 生成一个初始值默认为 0,终止值(不包含)设置为 20,步长默认为 1 的 4 行 5 列的数组。
m1 = np.arange(20).reshape((4,5))
print(m1)
m1.mean()
#[[ 0  1  2  3  4]
# [ 5  6  7  8  9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
#9.5
  • 如果我们想求某一维度的平均值,就设置 axis 参数,多维数组的元素指定。
    在这里插入图片描述
  • axis = 0,将从上往下(按列)计算。
m1 = np.arange(20).reshape((4,5))
print(m1)
m1.mean(axis=0)
#[[ 0  1  2  3  4]
# [ 5  6  7  8  9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
#array([ 7.5,  8.5,  9.5, 10.5, 11.5])
  • axis = 1,将从左往右(按行)计算。
m1.mean(axis=1)
#array([ 2.,  7., 12., 17.])

2. 中位数 np.median

  • 中位数又称中点数,中值。
  • 它是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值。
  • 平均数:是一个"虚拟"的数,是通过计算得到的,它不是数据中的原始数据;中位数:是一个不完全"虚拟"的数。
  • 平均数:反映了一组数据的平均大小,常用来一代表数据的总体 “平均水平”;中位数:像一条分界线,将数据分成前半部分和后半部分,因此用来代表一组数据的"中等水平"。
  • 接下来看两个例子,第一个中位数是数组中的元素,是一个不虚拟的数。
ar1 = np.array([1,3,5,6,8])
np.median(ar1)
#5.0
  • 第二个中位数是一个虚拟的数
ar1 = np.array([1,3,5,6,8,9])
np.median(ar1)
#5.5

3. 标准差 np.std

  • 在概率统计中最常使用作为统计分布程度上的测量,是反映一组数据离散程度最常用的一种量化形式,是表示精确度的重要指标
  • 标准差定义是总体各单位标准值与其平均数离差平方的算术平均数的平方根。
  • 简单来说,标准差是一组数据平均值分散程度的一种度量。
  • 一个较大的标准差,代表大部分数值和其平均值之间差异较大;
  • 一个较小的标准差,代表这些数值较接近平均值。
  • 例如,A、B 两组各有 6 位学生参加同一次语文测验,A 组的分数为 95、85、75、65、55、45,B 组的分数为 73、72、71、69、68、67,我们分析哪组学生之间的差距大(标准差大的差距大)?
a = np.array([95,85,75,65,55,45])
b = np.array([73,72,71,69,68,67])
print(np.std(a))
print(np.std(b))
#17.07825127659933
#2.160246899469287
  • 标准差应用于投资上,可作为量度回报稳定性的指标。标准差数值越大,代表回报远离过去平均数值,回报较不稳定故风险越高。相反,标准差数值越小,代表回报较为稳定,风险亦较小。

4. 方差 ndarray.var()

  • 方差是衡量随机变量或一组数据时离散程度的度量。
a = np.array([95,85,75,65,55,45])
b = np.array([73,72,71,69,68,67])
print('A组的方差为:',a.var())
print('B组的方准差为:',b.var())
#A组的方差为: 291.6666666666667
#B组的方准差为: 4.666666666666667
  • 标准差有计量单位,而方差无计量单位,但两者的作用一样,虽然能很好的描述数据与均值的偏离程度,但是处理结果是不符合我们的直观思维的。

5. 最大值 ndarray.max()

  • 最大值比较好理解,默认求出数组内所有元素的最大值。
  • axis = 0,将从上往下(按列)计算。
  • axis = 1,将从左往右(按行)计算。
print(m1)
print(m1.max())
print('axis=0,从上往下查找:',m1.max(axis=0))
print('axis=1,从左往右查找',m1.max(axis=1))
#[[ 0  1  2  3  4]
# [ 5  6  7  8  9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
#19
#axis=0,从上往下查找: [15 16 17 18 19]
#axis=1,从左往右查找 [ 4  9 14 19]

6. 最小值 ndarray.min()

  • 最小值比较好理解,默认求出数组内所有元素的最小值。
  • axis = 0,将从上往下(按列)计算。
  • axis = 1,将从左往右(按行)计算。
print(m1)
print(m1.min())
print('axis=0,从上往下查找:',m1.min(axis=0))
print('axis=1,从左往右查找',m1.min(axis=1))
#[[ 0  1  2  3  4]
# [ 5  6  7  8  9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
#0
#axis=0,从上往下查找: [0 1 2 3 4]
#axis=1,从左往右查找 [ 0  5 10 15]

7. 求和 ndarray.sum()

  • 求和比较好理解,默认求出数组内所有元素的总和。
  • axis = 0,将从上往下(按列)计算。
  • axis = 1,将从左往右(按行)计算。
print(m1)
print(m1.sum())
print('axis=0,从上往下查找:',m1.sum(axis=0))
print('axis=1,从左往右查找',m1.sum(axis=1))
#[[ 0  1  2  3  4]
# [ 5  6  7  8  9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
#190
#axis=0,从上往下查找: [30 34 38 42 46]
#axis=1,从左往右查找 [10 35 60 85]

8. 加权平均值 numpy.average()

加权平均值就是将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。

numpy.average(a, axis=None, weights=None, returned=False)
  • 其中,weights 表示数组,是一个可选参数,与 a 中的值关联的权重数组。
  • a 中的每个值都根据其关联的权重对平均值做出贡献。权重数组可以是一维的(在这种情况下,它的长度必须是沿给定轴的 a 的大小)或与 a 具有相同的形状。
  • 如果 weights=None,则假定 a 中的所有数据的权重等于 1。一维计算是:
avg = sum(a * weights) / sum(weights)
  • 对权重的唯一限制是 sum(weights) 不能为 0。`
average_a1 = [20,30,50]print(np.average(average_a1))
print(np.mean(average_a1))
#​33.333333333333336
#33.333333333333336

二、数据类型

名称描述
bool_布尔型数据类型(True 或者 False)
int_默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc与 C 的 int 类型一样,一般是 int32 或 int 64
intp用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8字节(-128 to 127)
int16整数(-32768 to 32767)
int32整数(-2147483648 to 2147483647)
int64整数(-9223372036854775808 to 9223372036854775807)
uint8无符号整数(0 to 255)
uint16无符号整数(0 to 65535)
uint32无符号整数(0 to 4294967295)
uint64无符号整数(0 to 18446744073709551615)
float_float64 类型的简写
float16半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_complex128 类型的简写,即 128 位复数
complex64复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128复数,表示双 64 位浮点数(实数部分和虚数部分)

1. 数据存储

  • 我们可以将数组中的类型存储为浮点型。
a = np.array([1,2,3,4],dtype=np.float64)
a
#array([1., 2., 3., 4.])
  • 我们可以将数组中的类型存储为布尔类型。
a = np.array([0,1,2,3,4],dtype=np.bool_)
print(a)
a = np.array([0,1,2,3,4],dtype=np.float_)
print(a)
#[False  True  True  True  True]
#[0. 1. 2. 3. 4.]
  • 其中 str_ 和 string_ 区别如下:
str1 = np.array([1,2,3,4,5,6],dtype=np.str_)
string1 = np.array([1,2,3,4,5,6],dtype=np.string_)
​str2 = np.array(['我们',2,3,4,5,6],dtype=np.str_)print(str1,str1.dtype)
print(string1,string1.dtype)
print(str2,str2.dtype)
#['1' '2' '3' '4' '5' '6'] <U1
#[b'1' b'2' b'3' b'4' b'5' b'6'] |S1
#['我们' '2' '3' '4' '5' '6'] <U2
  • 在内存里统一使用 unicode, 记录到硬盘或者编辑文本的时候都转换成了utf8 UTF-8 将 Unicode 编码后的字符串保存到硬盘的一种压缩编码方式

2. 定义结构化数据

  • 在上述数据存储的过程种,我们对于 U1、S1、U2 并不能直接理解,这里使用其实是数据类型标识码。
字符对应类型字符对应类型字符对应类型字符对应类型
b代表布尔型i带符号整型u无符号整型f浮点型
c复数浮点型m时间间隔(timedelta)Mdatatime(日期时间)OPython对象
S,a字节串(S)与字符串(a)UUnicodeV原始数据(void)

-还可以将两个字符作为参数传给数据类型的构造函数。

  • 此时,第一个字符表示数据类型, 第二个字符表示该类型在内存中占用的字节数(2、4、8分别代表精度为16、32、64位的 浮点数)。
  • 首先,我们创建结构化数据类型,然后,将数据类型应用于 ndarray 对象。
dt = np.dtype([('age','U1')]) 
print(dt)
students = np.array([("我们"),(128)],dtype=dt)
print(students,students.dtype,students.ndim)
print(students['age'])
#[('age', '<U1')]
#[('我',) ('1',)] [('age', '<U1')] 1
#['我' '1']
  • 以下示例描述了一位老师的姓名、年龄、工资的特征,该结构化数据其包含以下字段:
  • str 字段:name。
  • int 字段:age。
  • float 字段:salary。
import numpy as np
teacher = np.dtype([('name',np.str_,2), ('age', 'i1'), ('salary', 'f4')])
b = np.array([('wl', 32, 8357.50),
              ('lh', 28, 7856.80)
             ], dtype = teacher) 
print(b)
b['name']
b['age']
#[('wl', 32, 8357.5) ('lh', 28, 7856.8)]
#array([32, 28], dtype=int8)

3. 结构化数据操作

我们可以使用数组名 [结构化名],取出数组中的所有名称,取出数据中的所有年龄。

print(b)
print(b['name'])
print(b['age'])
#[('wl', 32, 8357.5) ('lh', 28, 7856.8)]
#['wl' 'lh']
#[32 28]

三、操作文件 loadtxt

loadtxt 可以读取 txt 文本和 csv 文件。

loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0,encoding='bytes')

其中参数具有如下含义:
(1) fname:指定文件名称或字符串。支持压缩文件,包括 gz、bz 格式。
(2) dtype:数据类型。默认 float。
(3) comments:字符串或字符串组成的列表。表示注释字符集开始的标志,默认为 #。
(4) delimiter:字符串。分隔符。
(5) converters:字典。将特定列的数据转换为字典中对应的函数的浮点型数据。例如将空值转换为 0,默认为空。
(6) skiprows:跳过特定行数据。例如跳过前 1 行(可能是标题或注释),默认为 0。
(7) usecols:元组。用来指定要读取数据的列,第一列为 0。例如(1, 3, 5),默认为空。
(8) unpack:布尔型。指定是否转置数组,如果为真则转置,默认为 False。
(9) ndmin:整数型。指定返回的数组至少包含特定维度的数组。值域为 0、1、2,默认为 0。
(10) encoding:编码, 确认文件是 gbk 还是 utf-8 格式
返回:从文件中读取的数组。

1. 读取文件内数据

例如 data1.txt 存在数据:
0 1 2 3 4 5 6 7 8 9

20 21 22 23 24 25 26 27 28 29

  • 我们在读取普通文件时,可以不用设置分隔符(空格 制表符)。
data = np.loadtxt(r'D:\桌面\数据分析-班级\1-2班\data1.txt',dtype=np.int32)
print(data,data.shape)
#[[ 0  1  3  3  4  5  6  7  8  9]
# [20 21 22 23 24 25 26 27 28 29]] (2, 10)
  • 我们在读取 csv 文件时,与普通文件不同,需要设置分隔符,csv 默认为 , 号。
data = np.loadtxt('csv_test.csv',dtype=np.int32,delimiter=',')
print(data,data.shape)
#[[ 0  1  2  3  4  5  6  7  8  9]
# [10 11 12 13 14 15 16 17 18 19]
# [20 21 22 23 24 25 26 27 28 29]] (3, 10)

2. 不同列标识不同信息,数据读取

我们有如下数据:

姓名年龄性别身高
小王21170
............
老王50180
  • 文件:has_title.txt
    (1) 以上数据由于不同列数据标识的含义和类型不同,因此我们需要自定义数据类型。
user_info = np.dtype([('name','U10'),('age','i1'),('gender','U1'),('height','i2')])

(2) 使用我们自定义的数据类型,进行读取数据操作。

data = np.loadtxt('has_title.txt',dtype=user_info,skiprows=1, encoding='utf-8')

这里需要注意的是,以上参数中,(1) 设置类型;(2) 跳过第一行;(3) 编码。

print(data['age'])
#[21 25 19 40 24 21 19 26 21 21 19 20]

在读取到文件数据后,我们可以对其数据进行一定的操作。
首先,我们可以获取年龄的数组,计算年龄的中位数。

ages = data['age']
ages.mean()
# 23.0

我们也可以计算女生的平均身高(设置一个读取条件即可)。

isgirl = data['gender'] == '女'print(isgirl)
print(data['height'])
data['height'][isgirl]
girl_mean = np.mean(data['height'][isgirl])
'{:.2f}'.format(girl_mean)
#[False  True  True False False  True  True False False  True  True  True]
#[170 165 167 180 168 167 159 170 168 175 160 167]
#'165.71'

3. 读取指定的列

读取指定的列 usecols=(1,3) 标识只读取第 2 列和第 4 列(索引从 0 开始)。

user_info = np.dtype([('age','i1'),('height','i2')])
print(user_info)
#[('age', 'i1'), ('height', '<i2')]

然后,使用自定义的数据类型,读取数据。

data = np.loadtxt('has_title.csv',dtype=user_info,delimiter=',',skiprows=1,usecols=(1,3))

这里需要注意的是,在以上参数中:(1) 设置类型;(2) 跳过第一行;(3) 分隔符。

print(data)
#[(22, 170) (25, 165) (19, 167) (20, 169) (21, 161) (19, 159) (27, 177)]

4. 数据中存在空值进行处理

需要借助用于 converters 参数,传递一个字典,key 为列索引,value 为对列中值的处理。
比如,我们具体如下数据,csv 中学生信息中存在空的年龄信息:

姓名年龄性别身高
小王21170
............
老谭50180

文件:has_empty_data.csv
如果我们直接读取指定的列 usecols=(1,3) ,会出现错误。
因此,在需要处理空数据的时候,我们需要创建一个函数接收列的参数,并加以处理。

def parse_age(age):
    try:
        return int(age)
    except:
        return 0

和之前一样的步骤,使用自定义的数据类型,读取数据

print(user_info)
data = np.loadtxt('has_empty_data.csv',dtype=user_info,delimiter=',',skiprows=1,usecols=(1,3),converters={1:parse_age,3:parse_age})
print(data)
#[('age', 'i1'), ('height', '<i2')]
#[(21, 170) (25, 165) (19, 167) ( 0, 169) (21, 161) (19,   0) (27, 177)]

age_arr = data['age']
age_arr
#array([21, 25, 19,  0, 21, 19, 27], dtype=int8)

age_arr[age_arr == 0] = np.median(age_arr[age_arr != 0])
age_arr.mean()
#21.857142857142858

计算班级年龄的平均值,由于存在 0 的数据,因此一般做法是将中位数填充。
首先,我们填充中位数,然后,我们计算平均值。

ages = data['age']
ages[ages==0] = np.median(ages)
print(ages)
np.round(np.mean(ages),2)
#[22 25 19 20 21 19 27]
#21.86

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcGIS笔记3_如何编辑、修改和导出散点数据

本文目录前言Step 1 在ArcGIS中添加并显示坐标点Step 2 将坐标数据保存成shp文件Step 3 编辑或修改坐标数据Step 4 导出修改后的数据&#xff1a;法一&#xff1a;通过转换工具导出Step 5 导出修改后的数据&#xff1a;法二&#xff1a;通过dBASE表导出前言 本博文更多针对Arc…

【函数栈帧的创建和销毁】 -- 神仙级别底层原理,你学会了吗?

文章目录1.函数的调用方式 2.函数在栈区上的动作 1.函数的调用方式 相信你对调用函数一点都不陌生&#xff0c;但是在调用函数的过程中&#xff0c;却存在着很多你无法见到的东西&#xff0c;这是底层信息&#xff0c;想要理解透彻&#xff0c;就得深入底层去观察。 本文以…

Spring之AOP底层源码解析

Spring之AOP底层源码解析 1、动态代理 代理模式的解释&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff0c;增强一个类中的某个方法&#xff0c;对程序进行扩展。 举个例子 public class UserService {public void test() {System.out.println("test.…

LeetCode-216. 组合总和 III

目录题目分析回溯三部曲剪枝优化题目来源 216. 组合总和 III 题目分析 这个和leetcode77组合类似 本题k相当于树的深度&#xff0c;9&#xff08;因为整个集合就是9个数&#xff09;就是树的宽度。 例如 k 2&#xff0c;n 4的话&#xff0c;就是在集合[1,2,3,4,5,6,7,8,9]中…

我的车载开发—{ carservice启动流程 }—

carservice启动流程 大致流程&#xff1a; SystemServer启动CarServiceHelperService服务在调用startService后&#xff0c;CarServiceHelperService的onStart方法通过bindService的方式启动CarService&#xff08;一个系统级别的APK&#xff0c;位于system/priv-app&#xf…

转转测试环境docker化实践

测试环境对于任何一个软件公司来讲&#xff0c;都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境docker稳定环境环境体系。期间环境系统不断的演进&#xff0c;去适应转转集群扩张、新业务的扩展&#xff0c;走了一些…

Linux系统基本设置:网络设置(三种界面网络地址配置)

网络地址配置&#xff1a;图形界面配置、命令行界面配置、文本图形界面配置 命令行界面配置 查看网络命令&#xff1a; 想要知道你有多少网卡&#xff0c;都可以通过这两个命令来查看 手动设置网络参数&#xff0c;我们可以使用nmcli这个命令来设置&#xff0c;我们需要知道…

【react实战小项目:笔记】用React 16写了个订单页面

视频地址 React 16 实现订单列表及评价功能 简介&#xff1a;React 以其组件化的思想在前端领域大放异彩&#xff0c;但其革命化的前端开发理念对很多 React 初学者来说&#xff0c; 却很难真正理解和应用到真实项目中。本课程面向掌握了 React 基础知识但缺乏实战经验的开发…

状态机分析

写在前面 状态机是指某事物具有有限状态&#xff0c;且在这些状态之间相互转换的抽象&#xff0c;比如门的开是一个状态&#xff0c;关又是一个状态。本文就一起来看下。 1&#xff1a;状态机的术语 1.1&#xff1a;state 状态&#xff0c;即当前所处的状态&#xff0c;如汽…

电子技术——内部电容效应以及MOS与BJT的高频响应模型

电子技术——内部电容效应以及MOS与BJT的高频响应模型 耦合和旁路电容决定了放大器的低频响应&#xff0c;同时内部电容效应决定了放大器的高频响应。本节&#xff0c;我们简单简单介绍一下内部电容效应&#xff0c;并且更重要的是如何在小信号模型中模型化内部电容效应。 MOS…

C语言操作符经典例题

一、选择题 1、下面哪个是位操作符&#xff1a;&#xff08; &#xff09; A.& B.&& C.|| D.! 答案解析&#xff1a; 答案&#xff1a;A A正确&#xff0c;&——按&#xff08;二进制&#xff09;位与&#xff0c;对应的二进制位&#xff1a;有0则0&#…

将python代码封装成c版本的dll动态链接库

前言 将python程序打包成DLL文件&#xff0c;然后用C调用生成的DLL文件&#xff0c;这是一种用C调用python的方法&#xff0c;这一块比较容易遇到坑。网上关于这一块的教程不是很多&#xff0c;而且大部分都不能完全解决问题。我在傻傻挣扎了几天之后&#xff0c;终于试出了一个…

第八章认识 Vue.js基础

vue.js 是一套用于构建用户界面的渐进式前端框架 vue.js 核心实现&#xff1a; 相应式的数据绑定&#xff1a;当数据发生改变&#xff0c;视图可以自动更新&#xff0c;不用关心DOM操作&#xff0c;而转型数据库操作 可组合的视图组件&#xff1a;把视图按照功能切分成若干的…

vr电力刀闸事故应急演练实训系统开发

电力事故是在电力生产和输电过程中可能发生的意外事件&#xff0c;它们可能会对人们的生命财产安全造成严重的威胁。因此&#xff0c;电力事故应急演练显得尤为重要。而VR技术则可以为电力事故应急演练提供一种全新的解决方案。 在虚拟环境中&#xff0c;元宇宙VR会模拟各种触电…

07 react+echart+大屏

reactechart大屏大屏ECharts 图表实际步骤React Typescript搭建大屏项目&#xff0c;并实现屏幕适配flexible rem实现适配1. 安装插件对echarts进行的React封装&#xff0c;可以用于React项目中&#xff0c;支持JS、TS如何使用完整例子官网参考大屏 ECharts 图表 ECharts 图…

【Java基础】泛型(二)-泛型的难点:通配符

本文将尝试将通配符和泛型中的继承&#xff0c;多态一并讲解 关于泛型中继承的注意事项 因为Integer、Double继承了Number&#xff0c;根据多态性&#xff0c;以下语句是合法的 Number n new Integer(10); // OK, 父类引用变量可以指向子类对象 n 2.9 // OK&#xff0c;n实…

Mac-Charles

Charles是什么 HTTP代理服务器&#xff0c;HTTP监视器 Charles可以当作一个代理服务器 当浏览器链接这个代理服务器的时候 Charles会监控浏览器发出和接收的所有数据(reques,response,HTTP Headers(cookies和cash)) 反转代理器 Charles主要功能、 1.SSL代理 2.模拟慢速网络…

双目立体视觉:SAD算法

算法原理SAD(Sum of absolute differences)是一种图像匹配算法。基本思想&#xff1a;差的绝对值之和。此算法常用于图像块匹配&#xff0c;将每个像素对应数值之差的绝对值求和&#xff0c;据此评估两个图像块的相似度。该算法快速、但并不精确&#xff0c;通常用于多级处理的…

如何在Power Virtual Agents中实现身份验证

今天我们介绍一下如何通过身份验证的方式来使用Power Virtual Agents。首先进入“Microsoft 365-管理-Azure Active Directory管理中心”。 进入“Azure Active Directory管理中心”后选择“Azure Active Directory”中的“应用注册”-“新注册”。 输入新创建的应用程序名称后…

XXL-JOB分布式任务调度框架(一)-基础入门

文章目录1.什么是任务调度2.常见定时任务方案2.1. 传统定时任务方案示例2.2. 缺点分析3.什么是分布式任务调度&#xff1f;3.1. 并行任务调度3.2. 高可用3.3. 弹性扩容3.4. 任务管理与监测4.市面上常见的分布式任务调度产品5.初识xxl-job6.xxl-job架构设计6.1.设计思想6.2.架构…