python 数据清洗-Numpy 库
1 NumPy 基础
1.1 数据的维度
- 维度:一组数据的组织形态

- 一维数据:由对等关系的有序或无序数据构成,采用线性组织
- 例如:
-
可以用 Python 中的基本类型(列表、集合)表示一维数据
-
也可以用数组表示一维数据
-
- 在 Python 中并没有数组类型这一说法,通常可以把列表认为为数组,但是列表于数组还是有些区别
- 列表:其数据类型可以不同

- 数组:其数据类型必须相同

- 列表:其数据类型可以不同
- 例如:
- 二维数据:由多个一维数据构成,为一维数据的组合形式
- 表格是典型的二维数据,其中表头是二维数据的一部分
- 多维数据:由一维或者二维数据在新维度上拓展形成
- 例如:在一张表格上加上时间维度,就可以构成一个三维的表格
- 高维数据:仅利用最基本的二元关系展示数据间的复杂结构
- 一般以键值对形式存在
1.2 NumPy 介绍
-
NumPy 是一个开源的第三方的 Python 科学计算基础库,是 SciPy、Pandas 等数据处理或科学计算库的基础
- 可以说 NumPy 是目前最基础的计算库
-
特点:
- 具有一个强大的 N 维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 支持线性代数、傅里叶变换、随机数生成等功能
-
NumPy 的安装(以 windows 为例)
PS C:\Users\Handsome Black>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy- 因为直接下载 NumPy 速度太慢,所以可以使用清华镜像
-
NumPy 的导入
import numpy as npas:设置导入模块的别名
- 尽管别名可以省略或更改,建议使用上述约定的别名
-
数据维度的表示
-
Python:
-
一维数据:列表和集合
-
二维数据:列表类型
-
多维数据:列表类型
-
高维数据:字典类型或者数据表示格式(json、xml)
-
-
NumPy:
- 一维数据:

- 二维数据:

- 多维数据:括号递加即可
- 一维数据:
-
1.3 IPython
-
IPython介绍:IPython 是一个 Python 的交互I式 shell,是利用 Python 进行科学计算和交互可视化的一个平台
- 因为比在 Charm 中编写代码更方便,所以后续代码操作在 IPython 进行
-
安装 IPython
-
在 windows 中:
PS C:\Users\Handsome Black>pip install iPython
-
-
如果需要使用 notebook 或者在 Qt console 中使用 IPython,还需要安装 Jupyter
PS C:\Users\Handsome Black>pip install jupyter -
使用交互式 IPython:
-
在 cmd 或者 powershell 中:
PS C:\Users\Handsome Black>ipthon
-
-
使用 IPython Notebook
-
在 cmd 或者 powershell 中:
PS C:\Users\Handsome Black>jupyter notebook
-
1.4 数组类型
1.4.1 为什么需要数组类型
-
Python 已有列表类型,为什么需要一个数组对象 (类型 ) ?
-
以一个例子作为说明:计算 $ A^2 +B^3$ 。。其中 \(A、B\) 是一维数组。\(A = [0,1,2,3,4],B = [9,8,7,6,5]\)
-
以 Python 编写程序:
def pySum(): A = [0,1,2,3,4] B = [9,8,7,6,5] C = [] for i in range(len(A)): C.append(A[i]**2 + B[i]**3) return C print(pySum()) -
以 NumPy 编写程序:
import numpy as np def pySum(): A = np.array([0,1,2,3,4]) B = np.array([9,8,7,6,5]) C = A**2 + B**3 return C print(pySum())
-
-
可以看出使用 Python 自带的列表进行操作,着重点仍是元素,不符合科学计算的基本思想,这是原因之一
-
-
其他的原因
- 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
- 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
- 科学计算中,一个维度所有数据的类型往往相同
- 数组对象采用相同的数据类型,有助于节省运算和存储空间
- NumPy 底层是由 C 实现,运算时间更短
1.4.2 数组对象 ndarray
-
ndarray 是一个多维数组对象。由实际的数据和描述这些数据的元数据(数据维度、数据类型等) 两部分构成
-
语法格式:
np.array((数据)[,元数据])后面会介绍一些元数据
-
ndarray 数组一般要求所有元素类型相同(同质),数组下标从 0 开始
- 可以使用类似列表的索引
-
ndarray 在程序中的别名是:array
- 在 Number 中 ndarray 是类对象,用于表示 N 维数组,也就是是一个统称的对象;而 array 是一个生成数组的函数,可以理解为一个方法
-
轴(axis)和秩(rank)是描述 numpy 模块的基本向量和方式
- 轴:保存数据的维度
- 秩:轴的数量
-
ndarray 对象的属性
属性 描述 .ndim 秩,即轴的数量或者维度的数量 .shape ndarray 对象的尺度,对于矩阵:n 行 m 列 .size ndarray 对象元素的个数,相当于 .shape 中 n*m 的值 .dtype ndarray 对象的元素类型 .itemsize ndarray 对象中每个元素的大小。以字节为单位 -
示例:
-
1.5 数组的元素类型
-
布尔类型
数据类型 说明 bool 布尔类型,返回 True 或者 False -
整数类型
数据类型 说明 intc 与 C 语言中的 int 类型一致,一般是 int32 或者 int64 intp 用于索引的整数,与 C 语言中的 ssize_t 一致,int32 或 int64 int8 字节长度的整数,取值:[-128,127] int16 16 位长度的整数,取值:[-32768,32767] int32 32 位长度的整数,取值:[-231- 231-1] int64 64 位长度的整数,取值:[-263 - 263-1] uint8 8 位无符号整数,取值:[0, 255] uint16 16 位无符号整数,取值:[0, 65535] uint32 32 位无符号整数,取值:[0, 232 ‐1] uint64 64 位无符号整数,取值:[0, 264‐1] -
浮点数类型
数据类型 说明 float16 16 位半精度浮点数: 1 位符号位, 5 位指数,10 位尾数 float32 32 位半精度浮点数: 1 位符号位, 8 位指数,23 位尾数 float64 64 位半精度浮点数: 1 位符号位, 11位指数,52 位尾数 - 浮点数类型形式:(符号)尾数*10指数
-
复数类型
数据类型 说明 complex64 复数类型,实部和虚部都是 32 位浮点数 complex128 复数类型,实部和虚部都是 64 位浮点数 - 复数类型形式:实部(.real)+ j 虚部(.imag)
-
ndarray 为什么要支持这么多种元素类型?
- 科学计算涉及数据较多,对存储和性能都有较高要求
- 对元素类型精细定义,有助于 NumPy 合理使用存储空间并优化性能
- 对元素类型精细定义,有助于程序员对程序规模有合理评估
-
同时 ndarray 还支持非同质计算
- 例如:
- 因为创建了 非同质的对象,所以发出 Warning 警告
- 所以不推荐使用 narray 对象创建非同质对象,同时非同质 ndarray 对象无法有效发挥NumPy优势,应该避免使用
- 例如:
2 NumPy 运用
2.1 ndarray 数组的创建
-
ndarray 数组常见创建方式为:Python 和 Numpy
-
由 Python 创建:使用 Python 的列表、元组等类型创建 ndarray 数组
-
语法格式:
x = np.array( [list|tuple][,dtype])当 np.array() 不指定 dtype 时,NumPy 将根据数据情况关联一个 dtype 类型
-
示例:

-
-
由 NumPy 创建:使用 NumPy 中函数创建 ndarray 数组,如:arange、ones、zeros 等
-
常用函数
函数 说明 np.arange(n) 类似 range() 函数,返回 ndarray 类型,元素索引:[0 - n-1] np.ones(shape) 根据 shape 生成一个全 1 数组,shape 是元组类型 np.zeros(shape) 根据 shape 生成一个全 0 数组,shape 为元组类型 np.full(shape,val) 根据 shape 生成一个数组,每个元素值都是 val np.eye(n) 创建一个正方的 n*n 单位矩阵,对角线元素为 1,其余元素为 0 - arange() 函数默认创建的数据类型为整数类型
- ones()、zeros()、eye() 等函数默认数据类型为浮点数类型,可以使用 dtype 属性指定数据类型
- 可以说 NumPy 结果基本都是浮点数
- 因为在实际的科学计算中,遇见的基本都是浮点数,遇见整数的时候几乎没有
- 可以说 NumPy 结果基本都是浮点数
-
示例:

-
同时还可以使用 NumPy 创建多维数组
- 示例:

- 示例:
-
其他创建函数
函数 说明 np.ones_like(a) 根据数组 a 的形状生成一个全 1 数组 np.zeros_like(a) 根据数组 a 的形状生成一个全 0 数组 np.full_like(a,val) 根据数组 a 的形状生成一个数组,每个元素值都是 val np.linspace() 根据起止数据等间距地填充数据,形成数组 np.concatenate() 将两个或多个数组合并成一个新的数 -
示例:使用 linspace() 创建数组

-
可以使用 参数 endpoint 指定后面的元素是开是闭,默认为闭
- 例如:

- 例如:
-
示例:使用 concatenate() 连接 a,b

-
-
2.2 ndarray 数组的变换
-
创建后的 ndarray 数组,可以对其进行维度变换和元素类型变换
-
维度变换
-
基本方法
方法 说明 .reshape(shape) 不改变数组元素,返回一个 shape 形状的数组,原数组不变 .resize(shape) 与 .reshape() 功能一致,但修改原数组 .swapaxes(ax1,ax2) 将数组 n 个维度中两个维度进行调换 .flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变 - 注意:什么会改变原数据,什么不会改变原数据
-
示例:


-
-
类型变换
-
方法:使用 astype() 方法拷贝源数据,再设置新参数 dtype 实现类型变换
-
示例:

-
-
ndarray 数组向列表的转换:使用 tolist() 方法
- 示例:

- 示例:
2.3 ndarray 数组的操作
-
主要是数组的索引和切片
- 索引:获取数组中特定位置元素的过程
- 切片:获取数组元素子集的过程
-
一维数组的索引和切片
- 一维数组的索引和切片:与 Python 的列表索引切片类似
- 示例:

- 示例:
- 一维数组的索引和切片:与 Python 的列表索引切片类似
-
多维数组的索引和切片
-
索引:每一维度一个索引值,使用逗号分割
- 示例:

- 示例:
-
切片:一个维度一个维度选取,方法与一维数组切片方向相同
-
示例:

-
-
注意:多维切片、索引不太直观,注意数据准确
-
2.4 ndarray 数组的运算
-
目前只讨论数组与标量之间的运算
- 数组与标量之间的运算作用于数组的每一个元素,也就是元素级的运算
-
一元函数的运算
-
对 ndarray 中的数据执行元素级运算的函数
函数 说明 np.abs(x) \ np.fabs(x) 计算数组各元素的绝对值 np.sqrt(x) 计算数组各元素的平方根 np.square(x) 计算数组各元素的平方 np.log(x) \ np.log10(x) \ np.log2(x) 计算数组各元素的自然对数、以10 底对数和 2底对数 np.ceil(x) \ np.floor(x) 计算数组各元素的 ceiling 值 或 floor np.rint(x) 计算数组各元素的四舍五入值 np.modf(x) 将数组各元素的小数和整数部分以两个独立数组形式返回 np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) 计算数组各元素的普通型和双曲型三角函数 np.exp(x) 计算数组各元素的指数值 np.sign(x) 计算数组各元素的符号值,1(+), 0, ‐1(‐) -
示例1:计算数组 a 各元素的平方根

- 注意原数据是否发生改变
-
示例2:将数组 b 各元素的小数和整数部分以两个独立数组形式返回

-
-
-
二元函数的运算
-
常见二次函数
函数 说明 + ‐ * / ** 两个数组各元素进行对应运算 np.maximum(x,y) np.fmax()
np.minimum(x,y) np.fmin()元素级的最大值 /最小值计算 np.mod(x,y) 元素级的模运算 np.copysign(x,y) 将数组 y 中各元素值的符号赋值给数组 x 对应元素 > < >= <= == != 算术比较,产生布尔型数组 -
示例1:计算 a、b 的最大值

-
示例2:a 与 b 进行大小比较

-
-
3 文件存取
3.1 csv 文件的存取
-
csv:一种常见以逗号作为分割符的文件格式,用于储存批量数据
-
写入 csv 文件:
np.savetxt()函数-
语法格式:
np.savetxt(frame, array, fmt, delimiter)frame:文件、字符串或产生器,可以是 .gz 或者 .bz2 的压缩文件
array:存入的数组
fmt:写入文件的格式,例如:%d、%.2f、%.18e,默认保存18位浮点数,是主要修改的参数
delimiter:分割字符串,默认是空格
-
-
读取 csv 文件:
np.loadtxt()函数-
语法格式:
np.loadtxt(frame[, dtype], delimiter, unpack)frame:文件、字符串或产生器,可以是 .gz 或者 .bz2 的压缩文件
dtype:数据类型
delimited:分割字符串,默认为空格
unpack:默认为 False,如果为 True ,则将读入的属性分别写入不同的变量
-
-
示例:

-
savetxt()和loadtxt()并不是专为读取 csv 文件设计,同时这两个函数只能有效存取一维和二维数组 -
csv 文件的局限性:只能有效存储一维和二维数组
3.2 多维数据的存取
-
任意维度的数据写入文件:
tofile()-
语法格式:
a.tofile(frame[, sep], format)frame:文件、字符串
sep:数据分割符,如果省略,则写入的文件为二进制文件
foramt:写入数据的格式,例如:%s
-
-
从文件读入数据:
fromfile()-
语法格式:
np.fromfile(frame[, dtype][, count][, sep])frame:文件、字符串
dtype:读取的数据类型
count:读取元素的个数,-1表示读取整个文件
sep:数据分割字符串,如果为空,则读取的文件为二进制文件
- 二进制格式文件占用更小的空间,多用于数据备份的格式
-
-
示例:

-
注意点:
- 存储的数据会失去对应的维度信息
- 使用这个方法时,需要读取时知道存入文件时数据主的维度和元素类型
tofile()和np.fromfile()需要配合使用
3.3 便捷文件存取
-
数据存入到文件
-
使用
np.save()或者np.savez() -
这种方式存取文件需要使用特定的 NumPy 格式
- 因为 这种特定格式文件(.npy 或者 .npz) 能够还原维度等存储信息
- .npy 文件第一行会存储这些信息

- .npy 文件第一行会存储这些信息
- 因为 这种特定格式文件(.npy 或者 .npz) 能够还原维度等存储信息
-
语法格式:
np.save(fname, array)np.savez(fname, array)frame:文件名,以 .npy 为扩展名,压缩拓展名为 .npz
array:数组变量
-
-
文件中读取数据:
np.load()-
语法格式:
np.load(fname)fname:文件名,以 .npy 为拓展名,压缩拓展名为 .npz
-
-
示例:

4 NumPy 中的部分函数
4.1 随机函数
-
NumPy 的随机函数存放在 random 子库中
-
np.random 的随机数函数(1)(常用函数)
函数 说明 rand(d0,d1,……,dn) 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布 randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布 randint(low[,high,shape]) 根据shape创建随机整数或整数数组,范围是[low, high) seed(s) 随机数种子,s是给定的种子值 -
实例:


-
-
np.random 的随机数函数(2)(高级函数)
函数 说明 shuffle(a) 根据数组 a 的第 1 轴进行随排列,改变数组 x permutation(a) 根据数组 a 的第 1 轴产生一个新的乱序数组,不改变数组 x choice(a[,size,replace,p]) 从一维数组 a 中以概率 p 抽取元素,形成 size 形状新数组 replace 表示是否可以重用元素,默认为 False -
np.random 的随机数函数(3)(带有分布的随机数组)
函数 说明 uniform(low,high,size) 产生具有均匀分布的数组,low 起始值,high 结束值,size 形状 normal(loc,scale,size) 产生具有正态分布的数组,loc 均值,scale 标准差,size 形状 poisson(lam,size) 产生具有泊松分布的数组,lam 随机事件发生率,size 形状
4.2 统计函数¥
-
统计数据:能对目标信息进行统计运算的函数
-
NumPy 的统计函数
函数 说明 sum(a, axis=None) 根据给定轴 axis 计算数组 a 相关元素之和,axis 可以为整数或元组 mean(a, axis=None) 根据给定轴 axis 计算数组 a 相关元素的期望(平均值),axis 可以为整数或元组 average(a,axis=None,weights=None) 根据给定轴 axis 计算数组 a 相关元素的加权平均值 std(a, axis=None) 根据给定轴 axis 计算数组 a 相关元素的标准差 var(a, axis=None) 根据给定轴 axis 计算数组 a 相关元素的方差 min(a) \ max(a) 计算数组 a 中元素的最小值、最大值 argmin(a) \ argmax(a) 计算数组 a 中元素最小值、最大值的降一维后下标 unravel_index(index, shape) 根据 shape 将一维下标 index 转换成多维下标 ptp(a) 计算数组 a 中元素最大值与最小值的差 median(a) 计算数组 a 中元素的中位数(中值) - axis:轴的意思
- axis=None 是统计函数的标配参数
- 用axis时,不要越界,即:N维数组,最大能使用axis=N-1
- axis = 0 :在第一维度进行运算
- axis = 1:在第二维度进行运算
- axis:轴的意思
-
示例1:使用 sum() 函数和 mean() 函数
-
- 怎么理解`np.mean(a,axis=0)`和`np.mean(a,axis=1)`的计算结果
- axis = 0:
第一步:axis=0 对应计算一维,其一维数据为:[0,1,2,3,4] 、[5,6,7,8,9] 和[10,11,12,13,14]
第二步:一维数据为数组,两者对应下标元素进行计算,即:[(0+5+10)/3,(1+6+11)/3,(2+7+12)/3,(3+8+13)/3,(4+9+14)/3]=[5,6,7,8,9]
- axis = 1:
第一步:axis=1 对应二维数据,其二维数据应该为:第一 [] 内: 0,1,2,3,4;第二 [] 内:5,6,7,8,9;第三 [] 内:10,11,12,13,14
第二步:二维数据为·数值,直接进行计算,即:[(0+1+2+3+4)/5,(5+6=7+8+9)/5,(10+11+12+13+14)/5]=[2,7,12]
-
-
示例2:

- unravel_index() 常与 shape() 联合使用
4.3 梯度函数
-
函数 说明 np.gradient(f) 计算数组 f 中元素的梯度,当 f 为多维时,返回每个维度梯度 -
梯度:连续值之间的变化率,
- 例如\(斜率设:XY, 坐标轴连续三个 X 坐标对应的 Y 轴值:a, b, c,其中,b的梯度是: (c‐a)\div2\)
-
示例:

-
中间的梯度计算:\((下值-上值)\div距离\)
- 例如:6 的原因:\((15-3)\div2=6\)
-
左侧的梯度计算:\((下值-当前值)\div距离\)
- 例如:-10 的原因:\((3-13)\div1=-10\)
-
右侧的梯度计算:\((当前值 - 上值)\div距离\)
-
-
梯度函数的意义:
- 反应元素的变换率,多用于媒体处理

浙公网安备 33010602011771号