Python数据清洗之Numpy

Posted 土味儿大谢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据清洗之Numpy相关的知识,希望对你有一定的参考价值。

一、Numpy数据类型与常用数组

1.1 构建ndarray

import numpy as np

维度看最外层方括号数量,一个方括号是一维,两个方括号是二维…

如果类型不匹配,NumPy 将会向上转换(字符串>浮点数>整数)

1.2 指定类型创建

1.3 查看类型ndarray.dtype

ndarray.dtype用来显示当前ndarray对象的数据属于什么类型:

1.4 类型转换ndarray.astype()

  • 第一种方式: ndarray.astype(“数据类型名”)
  • 第二种方式: ndarray.astype(np.数据类型名)

1.5 常用的数组

1.5.1 np.arange()

和普通数组创建语法一样

1.5.2 np.linspace()

np.linspace(start, stop, num=50, endpoint=True)

  • 在指定的间隔内返回均匀间隔的数字,用作相同间隔采样。
  • start:标量,序列的起始值。
  • stop:标量,除非"endpoint"设置为False,否则为序列的结束值。
  • num:int,可选。要生成的样本数。默认值为50.必须为非负数。

1.5.3 np.zeros()

1.5.4 np.ones()

1.5.5 np.eye()

返回一个二维数组,其中对角线为1,零点为零的二维数组。(单位矩阵)

1.5.6 np.full()

返回给定形状和类型的新数组,填充fill_value

  • np.full(shape,fill_value,dtype = None)
  • shape:int或int的序列新数组的形状,例如(2,3)或2。
  • fill_value:标量填充值。
  • dtype:数据类型,可选数组所需的数据类型默认值为"None"。

1.5.7 设置空值

np中缺失值用np.nan表示,其他ndarry对象与之运算的结果都为缺失值,运算结果数组的形状与参与运算的数组的形状 一致。

1.5.8 随机数组

1.5.8.1 np.random.randint()

1.5.8.2 np.random.random()

1.5.8.3 np.random.uniform()

  • 语法:np.random.uniform(low=0.0, high=1.0, size=None)
  • 返回随机浮点数,在半开区间[a,b)中。

1.5.8.4 np.random.randn()

  • 语法:np.random.randn(形状)
  • 从“标准正态”分布中返回一个样本(或样本)。

1.5.8.5 np.random.normal()

  • 语法:normal(平均值,标准偏差,形状)
  • 作用:从正态分布中抽取随机样本。
  • 如果平均值和标准差为0和1,或者不写这两个参数,就等同于
  • np.random.randn()


1.5.8.6 np.random.choice()

1.5.8.7 np.random.shuffle()

通过混洗其内容来就地修改序列。此功能仅沿a的第一轴洗牌。

  • np.random.shuffle(x)

    • x:array_like(要洗牌的数组或列表)。
  • 对于一维数组,打乱的对象是一个个元素的顺序

  • 对于二维数组,打乱的对象是一个个一维数组

  • 对于三维数组,打乱的对象是一个个二维数组

二、Numpy属性、索引和切片

2.1 ndarray常用属性

2.1.1 np.random.seed()

若不设定随机数种子,那么每次运行后产生的随机数都不一样,设定了后产生的随机数不会自动改变

2.1.2 ndarray.shape

查看数组的形状

2.1.3 ndarray.ndim

查看数组的维度

2.1.4 ndarray.size

查看数组元素个数

2.2 数组的索引和切片

单元素索引和切片操作和普通数组一样

2.2.1 多维数组索引

注意:行和列的索引位置用逗号隔开

也可以按照以往嵌套列表元素的方法,一层一层取。但是推荐用上面那种方法

例如想取红框内元素

2.2.2 修改数组元素值

2.2.3 二维切片

切片语法没有任何变化
x[start:stop:step]

注意,二维数组切片的取法,下面两种方法的差异:


三、Numpy的变形、拼接和分裂

import numpy as np

3.1 数组的变形

3.1.1 ndarray.reshape

同样地,可以对3维数组进行变形,此时注意数组中元素的总和即可:

技巧:在使用 reshape 时,可以将其中的一个维度指定为 -1,Numpy 会自动计算出它的真实值
注意:只能出现一个-1

3.1.2 ndarray.shape

使用ndarray.shape有两种场景:

第一种是查看数组形状:

第二种是改变数组形状

3.1.3 ndarray.resize()

使用 resize 方法可以直接修改数组本身
作用和shape改变数组形状是一样的,即改变数组本身。

3.1.4 ndarray.ravel()

数组的平铺。
不管多少维,全部铺开变成一维。

3.1.5 ndarray.T

注:无论是ravel、reshape、T,它们都不会更改原有的数组形状,都是返回一个新的数组

3.2 数组的拼接

  • 一维数组只有一个轴
    • axis=0 基本操作单位是一维数组里的一个个元素
  • 二维数组有两个轴
    • axis=0 基本操作单位是二维数组里的一个个一维数组
    • axis=1 基本操作单位是一维数组里的一个个元素
  • 三维数组有三个轴
    • axis=0 基本操作单位是三维数组里的一个个二维数组
    • axis=1 基本操作单位是二维数组里的一个个一维数组
    • axis=2 基本操作单位是一维数组里的一个个元素

3.2.1 np.concatenate()

同样地,我们观察一下三维数组合并规律:

3.2.2 np.vstack()

垂直堆叠数组

3.2.3 np.hstack()

水平堆叠数组

3.3 数组的分裂

3.3.1 np.split()

因为返回的对象是子阵列表,因此是可以进行索引操作的:



按照axis=1来划分


3.3.2 np.vsplit()

‘vsplit’相当于’split’用’axis = 0’来’拆分’

3.3.3 np.hsplit()

‘hsplit’相当于’split’用’axis = 1’来’拆分’

四、Numpy的运算与排序

常用运算基本操作和普通数组一样

4.1 矩阵运算

  • 需要注意的是,乘法运算符*的运算在NumPy数组中也是元素级别的。
  • 如果想要执行矩阵乘积,可以使用dot函数:
  • dot(a, b, out=None)
    • 如果’a’和’b’都是1-D数组,它就是向量的内积。
    • 如果’a’和’b’都是二维数组,那就是矩阵乘法。
    • 如果’a’或’b’是0-D(标量),它相当于’numpy.multiply(a,b)'或’a * b’是首选。
    • 如果’a’是N-D数组而’b’是1-D数组,则它是和的乘积’a’和’b’的最后一个轴。

如果a和b都是一位数组,就是求向量的内积

如果c和d都是二维数组,就是求矩阵乘法

4.2 判断符的妙用

如果想要将数组a中奇数元素删除:

4.3 聚合函数

4.3.1 常用聚合函数

函数说明
sum对数组中全部或某轴向的元素。零长度的数组sum为0
mean算数平均数。零长度的数组mean为nan
std、var标准差、方差
min、max最大值、最小值
argmin、argmax最大和最小元素的索引
cumsum、cumprod累计和、累计积

上面的求和方式可以通过数组对象来调用.sum()函数:

对于二维数组的操作,如果是axis=0

  • 操作的对象就是一维数组之间的操作

对于二维数组的操作,如果是axis=1

  • 操作的对象就是一维数组内部的一个个元素

中位数
第一步:先对序列升序排列
第二步:取中间的值
如果中间的值有两个,则去中间两个值的均值

  • 6、3、7由小到大排列,变成:3、6、7
  • 3、6、7中间的数6就是这个序列的中位数

[6,3,7,8]

  • 排序:3、6、7、8
  • 取中间两个数的均值(6+7)/2=6.5

如果序列数值中,有一些过大或过小的数值,[6,3,7,8,8888]–>3,6,7,8,8888–>中位数就是7

中位数:体现序列数值的集中程度,使用中位数来描述集中程度的好处是:可以避免过大或者过小的数值的干扰

  • 均值:如果用均值来描述数据的集中程度,缺点:容易受异常值干扰


方差怎么求?

  • 第一步:求出序列的均值5
  • 第二步:序列中每个数值减去均值5(本意在于:求出每个数和均值之间的距离)
  • 第三步:每个差值分别求平方
  • 第四步:所有平方结果求和
  • 第五步:求和结果除以序列中数值的数量3

标准差为方差的开方


cumsum(累计和)、cumprod(累计积)

4.3.2 Numpy聚合函数使用场景

student_grade.txt文档内容如下

4.4 Numpy的快速排序

4.4.1 np.sort()

4.5 唯一化和集合逻辑

方法说明
unique(x)计算x中的唯一元素,并返回有序结果。
intersect1d(x,y)计算x和y的公共元素,并返回有序结果。
union1d(x,y)计算x和y的并集,并返回有序结果。
in1d(x,y)得到一个表示“x的元素是否包含于y”的布尔型数组。
setdiff1d(x,y)集合的差,即元素在x中且不在y中。
setxor1d(x,y)集合的对称性,即存在于一个数组中但不同时存在于两个数组中的元素。

4.5.1 唯一化

np.unique()#去重

4.5.2 交集

4.5.3 并集(去重)

4.5.4 差集

4.5.5 补集

五、Numpy数组拉伸和函数向量化

5.1 数组拉伸

5.1.1 列表推导式


5.2 函数的向量化

5.2.1 frompyfunc 函数

frompyfunc(func,nin,nout)

  • 采用任意Python函数并返回NumPy ufunc。
  • 例如,可以用于向内置Python添加广播功能。
  • 参数
    • func:Python函数对象,任意Python函数。
    • nin:int,输入参数的数量。
    • nout:int,'func’返回的对象数。(NumPy通用函数(ufunc)对象。)

5.2.2 vectorize 函数

np.vectorize([‘pyfunc’,‘otypes = None’)

  • 定义一个矢量化函数,它接受一组嵌套的对象或numpy数组作为输入并返回单个numpy数组或元组输出。
    • pyfunc:可调用python函数或方法。
    • otypes:str或dtypes列表,可选输出数据类型。必须将其指定为字符串typecode字符或数据类型说明符列表。应该是每个输出的一个数据类型说明符。

需要注意的是,vectorize函数主要作用是提供便利,而不是性能。它的实现本质上是for循环。

以上是关于Python数据清洗之Numpy的主要内容,如果未能解决你的问题,请参考以下文章

Python数据清洗——Numpy

文摘:DataFrame数据清洗

Python pandas用法

python数据处理:NumPy基础

数据清洗之 聚合函数使用

Python第19课:数据清洗之去错、去空、去重