python 数据清洗-Numpy 库

1 NumPy 基础

1.1 数据的维度

  • 维度:一组数据的组织形态
    image-20220120172431885
  • 一维数据:由对等关系的有序或无序数据构成,采用线性组织
    • 例如:image-20220120172723658
      • 可以用 Python 中的基本类型(列表、集合)表示一维数据

      • 也可以用数组表示一维数据

    • 在 Python 中并没有数组类型这一说法,通常可以把列表认为为数组,但是列表于数组还是有些区别
      • 列表:其数据类型可以不同
        image-20220120173502737
      • 数组:其数据类型必须相同
        image-20220120173544704
  • 二维数据:由多个一维数据构成,为一维数据的组合形式
    • 表格是典型的二维数据,其中表头是二维数据的一部分
  • 多维数据:由一维或者二维数据在新维度上拓展形成
    • 例如:在一张表格上加上时间维度,就可以构成一个三维的表格
  • 高维数据:仅利用最基本的二元关系展示数据间的复杂结构
    • 一般以键值对形式存在

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 np
    

    as:设置导入模块的别名

    • 尽管别名可以省略或更改,建议使用上述约定的别名
  • 数据维度的表示

    • Python:

      • 一维数据:列表和集合

      • 二维数据:列表类型

      • 多维数据:列表类型

      • 高维数据:字典类型或者数据表示格式(json、xml)

    • NumPy:

      • 一维数据:
        image-20220122121814475
      • 二维数据:
        image-20220122190700772
      • 多维数据:括号递加即可

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 对象中每个元素的大小。以字节为单位
    • 示例:

      image-20220121195440740

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 还支持非同质计算

    • 例如:
      image-20220121215654476
      • 因为创建了 非同质的对象,所以发出 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 类型

    • 示例:
      image-20220121221054712

  • 由 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 结果基本都是浮点数
          • 因为在实际的科学计算中,遇见的基本都是浮点数,遇见整数的时候几乎没有
    • 示例:
      image-20220122104549338

    • 同时还可以使用 NumPy 创建多维数组

      • 示例:
        image-20220122104848115
    • 其他创建函数

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

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

        • 例如:
          image-20220122111202625
      • 示例:使用 concatenate() 连接 a,b
        image-20220122111444794

2.2 ndarray 数组的变换

  • 创建后的 ndarray 数组,可以对其进行维度变换和元素类型变换

  • 维度变换

    • 基本方法

      方法 说明
      .reshape(shape) 不改变数组元素,返回一个 shape 形状的数组,原数组不变
      .resize(shape) 与 .reshape() 功能一致,但修改原数组
      .swapaxes(ax1,ax2) 将数组 n 个维度中两个维度进行调换
      .flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变
      • 注意:什么会改变原数据,什么不会改变原数据
    • 示例:
      image-20220122113333020
      image-20220122113407517

  • 类型变换

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

    • 示例:
      image-20220122114358321

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

    • 示例:
      image-20220122115210438

2.3 ndarray 数组的操作

  • 主要是数组的索引和切片

    • 索引:获取数组中特定位置元素的过程
    • 切片:获取数组元素子集的过程
  • 一维数组的索引和切片

    • 一维数组的索引和切片:与 Python 的列表索引切片类似
      • 示例:
        image-20220122120140653
  • 多维数组的索引和切片

    • 索引:每一维度一个索引值,使用逗号分割

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

      • 示例:

        image-20220122123346212

    • 注意:多维切片、索引不太直观,注意数据准确

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 各元素的平方根
        image-20220122142444428

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

  • 二元函数的运算

    • 常见二次函数

      函数 说明
      + ‐ * / ** 两个数组各元素进行对应运算
      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 的最大值
        image-20220122143539148

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

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 ,则将读入的属性分别写入不同的变量

  • 示例:
    image-20220122165121043

  • 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:数据分割字符串,如果为空,则读取的文件为二进制文件

      • 二进制格式文件占用更小的空间,多用于数据备份的格式
  • 示例:
    image-20220122172001535

  • 注意点:

    • 存储的数据会失去对应的维度信息
    • 使用这个方法时,需要读取时知道存入文件时数据主的维度和元素类型
    • tofile()np.fromfile()需要配合使用

3.3 便捷文件存取

  • 数据存入到文件

    • 使用np.save()或者np.savez()

    • 这种方式存取文件需要使用特定的 NumPy 格式

      • 因为 这种特定格式文件(.npy 或者 .npz) 能够还原维度等存储信息
        • .npy 文件第一行会存储这些信息
          image-20220122180934415
    • 语法格式:

      np.save(fname, array)
      
      np.savez(fname, array)
      

      frame:文件名,以 .npy 为扩展名,压缩拓展名为 .npz

      array:数组变量

  • 文件中读取数据:np.load()

    • 语法格式:

      np.load(fname)
      

      fname:文件名,以 .npy 为拓展名,压缩拓展名为 .npz

  • 示例:

    image-20220122180621298

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是给定的种子值
    • 实例:
      image-20220122182843929

      image-20220122182909779

  • 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:在第二维度进行运算
  • 示例1:使用 sum() 函数和 mean() 函数

    • image-20220122190122897 - 怎么理解`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:

    image-20220122205613297

    • unravel_index() 常与 shape() 联合使用

4.3 梯度函数

  • 函数 说明
    np.gradient(f) 计算数组 f 中元素的梯度,当 f 为多维时,返回每个维度梯度
  • 梯度:连续值之间的变化率,

    • 例如\(斜率设:XY, 坐标轴连续三个 X 坐标对应的 Y 轴值:a, b, c,其中,b的梯度是: (c‐a)\div2\)
  • 示例:
    image-20220122211541265

    • 中间的梯度计算:\((下值-上值)\div距离\)

      • 例如:6 的原因:\((15-3)\div2=6\)
    • 左侧的梯度计算:\((下值-当前值)\div距离\)

      • 例如:-10 的原因:\((3-13)\div1=-10\)
    • 右侧的梯度计算:\((当前值 - 上值)\div距离\)

  • 梯度函数的意义:

    • 反应元素的变换率,多用于媒体处理
posted @ 2021-10-27 09:33  你是我的生命之源  阅读(251)  评论(0)    收藏  举报
页脚