数据清洗
介绍:进行数据清洗所使用的是python第三方库中的Numpy库
Numpy
导入Numpy包:
import numpy as np
Ndarray
Ndarray属性
1. ndarray.shape 返回一个包含数组维度的元组
2. ndarray.dtype 返回数组元素的类型
3. ndarray.ndim 返回数组的维度
4. ndarray.size 返回数组中包含元素的个数
创建Ndarray对象
创建矩阵的核心在于:要创建什么样的矩阵,矩阵中元素的类型时什么,矩阵是多大的
-
使用np.array函数: numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
object:列表、元组等 dtype:数据类型。如果未给出,则类型为被保存对象所需的最小类型 copy:布尔来写,默认 True,表示复制对象 order:顺序 subok:布尔类型,表示子类是否被传递 ndmin:生成的数组应具有的最小维数 如果要创建一维数组则在object参数上增加一个[数组],创建二维的数组则在object上增加[数组1],数组[2],其输出结果带有两个[[]]表示二维数组,其中[]嵌套的个数代表数组的维度。 -
随机数生成 使用np.random类中的方法创建: 创建全是整数的矩阵:np.random.randint() np.random.randint(low、high、size);
low:表示最小值 high:表示最大值 size=(行数,列数) 创建元素从[0-1)服从正态分布的矩阵:np.random.rand() np.random.rand(d0,d1,d2……dn)
有几个参数表示几维数组,若只有两个参数d0,d1则行数为d0,列数为d1的矩阵 创建自定义范围[x,y)服从正态分布的矩阵:np.random.uniform() np.random.uniform(low,high,d0,d1,d2……dn)
low:表示可以取到的最低值 high:表示取不到的最高值 创建取值服从标准正态分布的矩阵:np.random.randn() np.random.randn(d0,d1,d2……dn)
这里面的d0,di1,d2要用()括起来写入参数,用法与np.random.rand()类似 -
使用np.arrange () 创建数组 np.range(start, stop[, step])
取值范围:[start,stop) 步长为step表示间隔多少取一个元素 -
创建特殊数组 全零数组:np.zero(shape, dtype=float, order=‘C’); 全1数组:np.ones(shape, dtype=float, order=‘C’); 全n数组:np.full(shape, fill_value, dtype=None, order=‘C’) shape决定维度,dtype决定元素类型,order决定行优先还是列优先 fill_value决定矩阵元素是什么 线性矩阵数组: np.inspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None); start 采样的起点; stop 采样的终点;默认的取值是[start,stop] num 采样的点个数,默认为50个,必须是非负数 endpoint 决定是否包括端点stop,默认为true,即包括stop点 单位矩阵数组:np.eye(N, M=None, k=0, dtype=<class ‘float’>, order=‘C’) N表示行数;M表示列数;当只有行数没有列数时表示一个方阵 k表示对角线元素偏移的行数,正数向右上偏移,负数向左下偏移 对角矩阵数组:np.diag(v,k=0) 如果v是2D数组,返回k位置的对角线,如果v是1D数组,返回一个v作为k位置对角线的2维数组。 k表示对角线元素偏移的行数,正数向右上偏移,负数向左下偏移
Numpy数组的向量化
定义:数组表达式替换显式循环的做法通常称为向量化
功能:可以通过直接对数组进行加减,乘除
Ndarray的各种变换操作
维度变换
-
使用reshape方法: reshpe(a,newshape,order=‘C’)
a:输入的数组;newshape:新格式数组的形状;order决定行优先还是列优先 对原来的数组使用reshape不会对原来的数组进行更改,如果需要保存则需要创建一个数组保存它 -
使用resize方法: resize(a,newshape,order=‘C’)
a:输入的数组;newshape:新格式数组的形状;order决定行优先还是列优先 对原来的数组使用resize则会直接修改原来的数组形状,而不需要设置新的变量捕捉
元素类型变换
使用astype函数:
astype(type类型)
对原数组使用astype后,如果要保留类型转变后的数组则需创造新的数组变量来捕捉
数组转变为列表
使用tolist函数:
tolist()
Numpy的广播功能
广播就是将数组向某一方向(横向,纵向)复制成某一形状,以解决数组间形状不同而不能够进行运算的问题
符合广播的情况:
- 如果运算双方都是数组且两个数组的形状不一样,一个数组向一个方向广播后可以得到另一个数组的形状,则广播可行
- 如果运算双方都是数组且两个数组的形状不一样,两个数组各自向两个方向广播,广播后的形状相同,则广播可行
- 如果运算的双方一个是标量(单个数值),则不受广播的方向的约束,可以向两个方向广播
访问Ndarray中的元素–索引和切片
基本索引和切片
索引:直接通过 [ ]进行存取
切片:取某几个间隔相同的元素的集合
说明:通过基本切片生成的所有数组始终是原始数组的视图,修改原始数组,视图也会发生变化
切片语法:Ndaray[start:stop:step]
三个参数都可以被省略,如果start被省略则从第0个位置开始切片,如果stop被省略,切片到最后一个位置,如果step被省略则默认步长为1
切片的范围为:[start,stop)
倒序切片时要注意步长与切片方向相同,从左到右为正,从右到左为负并且倒叙切片的时候可以将最右边的元素的位置置为-1,在最右边元素左侧的元素的位置都为负值,切片步长也为负值
倒序全切片:start,stop省略而把step置为-1即可倒序全切片
保存切片:在切片后使用,copy()函数进行深拷贝到另一个数组中去,拷贝的数组与原数组相互独立,互不影响
整数数组索引和切片
为了解决不连续,不规则的切片所引出的高级切片方法
语法规则:
arr[[元素所在数组中第0个轴上的位置],[元素所在数组中第1个轴上的位置].....]
说明:返回数组的副本,与原数组相互独立
高维数组的索引和切片
索引与C语言中的访问多维数组的元素的方式相同
切片要先确定要切的在第几维度,然后再在索引的相应维度进行切片即可,例如在二维数组中切片:
arr2[2][1:4]
bool索引
语法:arr[bool判断语句]
通过bool索引可以获得bool判断语句为1的元素的集合
Numpy运算
算术运算
算数运算函数:
np.exp(x) 计算e的x次方 np.log(a) 求自然对数
np.exp2(x) 计算2的x次方 np.mod(a,b) 求a%b
np.power(a,b) 计算a的b次方
取整函数与统计函数
取整函数
-
四舍五入,0.5取偶数 np.around(a,k)
k参数代表保留几位小数 -
向上取整与向下取整 np.floor(a) 向上取整
np.ceil(a) 向下1取整
统计函数
统计量:最大值,最小值,均值,中位数,标准差,方差
最大值:当k不取值时默认为全局最大值,取值后是按照轴间对应的值做对比取最大值
np.amax(a,axis=k) //axis代表轴
最小值:当k不取值时默认为全局最小值,取值后是按照轴间对应的值做对比取最小值
np.amin(a,anix=k)
求和:当k不取值时默认为全局求和,取值后是按照轴上的每个元素求和
np.sum(a,anix=k)
求均值:当k不取值时默认为全局均值,取值后是按照轴求均值
np.mean(a,anix=k)
求方差:当k不取值时默认为全局方差,取值后是按照轴上求方差
np.var(a,anxi=k)
求标准差:当k不取值时默认为全局标准差,取值后是按照轴上求标准差
np.std(a,anxi=k)
求中位数:当k不取值时默认为全局中位数,取值后是按照轴求中位数
np.median(a,anxi=k)
排序和索引
排序:
numpy.sort(a, axis, kind, order)
a: 要排序的数组
axis: 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序,默认是最内测的轴,在二维数组中:axis=0 按列排序,axis=1 按行排序
kind: 默认为’quicksort’(快速排序)
order: 如果数组包含字段,则是要排序的字段
索引:
寻找非零位置的索引:
np.nonzero(a)
返回非零的元素:
arr[np.nonzero(a)]
返回bool值为一的元素索引:
np.where(condition, x, y)
满足condition则把x拿出,不满足condition则把y拿出来
归一化
作用:去重并排序
numpy.unique(arr, return_index, return_inverse, return_counts)
arr :输入数组,如果不是一维数组则会展开
return_index :如果为true ,返回新列表元素在旧列表中的位置(下标),并以列表形式储
return_inverse :如果为true ,返回旧列表元素在新列表中的位置(下标),并以列表形式储
return_counts :如果为true ,返回去重数组中的元素在原数组中的出现次数
集合逻辑
数组符合集合逻辑:可以求交并补并判断元素是否在数组当中
判断元素是否在数组中:判断a是否在b中并返回一个列表,invert默认为Flase表示不反转结果,反之则反转结果
np.inid(a,b,invert)
求交集:求a和b的交集
np.intersect1d(a,b)
求并集:求a和b的并集
np.union1d(a,b)
求差集:求a和b的差集,在a而不在b中的元素
np.setdiff1d(a,b)
|