python的强大之处就是能够便捷地对数据进行操作、处理、清洗和可视化,从而对数据进行分析。在如今机器学习和人工智能兴起的时代,python进行数据处理和分析就显得更加重要了,是一门必不可少的技能之一。以前也一直接触过python,也用它处理过不少数据和东西,但都是零零碎碎地,不太扎实吧。因此,最近机缘巧合地有机会系统性地学习一下python处理数据的操作和方法,因此简单记录一下一些常用的函数和操作,方便以后查询,常用常查。
Numpy库是python数值计算的核心组成部分,提供了多种数据结构、算法和大量数值计算的接口,能够快速进行高维数组对象的计算。安装Numpy库很简单,可以直接通过Anaconda或者pip安装。
一般,习惯性用下面这个命令导入Numpy库
import numpy as np
下表列出了NumPy中定义的不同数据类型。
数据类型 | 描述 |
---|---|
bool | 存储为一个字节的布尔值(真或假) |
int | 默认整数,相当于 C 的long,通常为int32或int64 |
int8 | 1个字节(-128 ~ 127) |
int16 | 16 位整数(-32768 ~ 32767) |
int32 | 32 位整数(-2147483648 ~ 2147483647) |
int64 | 64 位整数 |
uint8 | 8 位无符号整数(0 ~ 255) |
uint16 | 16 位无符号整数(0 ~ 65535) |
uint32 | 32 位无符号整数(0 ~ 4294967295) |
uint64 | 64 位无符号整数 |
float32 | 单精度浮点:符号位,8 位指数,23 位尾数 |
float64 | 双精度浮点:符号位,11 位指数,52 位尾数 |
complex64 | 复数,由两个 32 位浮点表示(实部和虚部) |
complex128 | 复数,由两个 64 位浮点表示(实部和虚部) |
object | Python对象类型 |
string | 修正的ASCII字符串类型 |
unicode | 修正的Unicode类型 |
Numpy还有一些预先定义的特殊值:
特殊值 | 描述 |
---|---|
np.nan | 缺失值 |
np.pi | 圆周率 3.1415926… |
np.e | 自然数e 2.718281828459045… |
我们可以直接定义数据的类型,例如
a = np.array([3,4,5],dtype=np.int)
也可以使用np.astype
显式地转换数据类型
>>> a = np.arange(1, 6)
>>> a.dtype
dtype('int32')
>>> f_a = a.astype(np.float64)
>>>> f_a.dtype
dtype('float64')
函数 | 描述 |
---|---|
random | 返回一个区间[0.0, 1.0)中的随机浮点数 |
seed | 向随机数生成器传递随机状态种子 |
permutation | 返回一个序列的随机排列,或者返回一个乱序的整数范围序列 |
shuffle | 随机排列一个序列 |
rand | 从均匀分布中抽取样本 |
randint | 根据给定的由低到高的范围抽取随机整数 |
randn | 从均值0,方差1的正态分布中抽取样本 |
binomial | 从二项式分布中抽取样本 |
normal | 从正态分布中抽取样本 |
beta | 从beta分布中抽取样本 |
chisquare | 从卡方分布中抽取样本 |
gamma | 从伽马分布中抽取样本 |
uniform | 从均匀[0,1)中抽取样本 |
创建数组的方式有很多种,比如使用array方法,并提供标准的Python列表或者元组
作为参数。array函数会自动将二维或三维序列转换为对应的二维或三维数组。当然,我们在创建的时候,可以显式地指定数据的类型。
>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j, 2.+0.j],[ 3.+0.j, 4.+0.j]])
下面是一些创建数组时常用的函数:
函数 | 描述 |
---|---|
np.zeros | 创建一个都是0的数组 |
np.ones | 创建一个都是1的数组 |
np.eyes(n) | 创建n维度的单位矩阵 |
np.empty | 创建一个初始内容是0或者垃圾值的数组 |
numpy.arange(start, stop, step, dtype) | 返回一个有终点和起点的固定步长的排列 |
numpy.linspace(start, stop, num, endpoint, retstep, dtype) | 指定在区间内均匀生成几个数,至于步长,系统会自动计算 |
通常来说,对数组做基本的算术运算,将会对整个数组的所有元组进行逐一运算,并将运算结果保存在一个新的数组内,而不会破坏原始的数组。下面是通用计算函数:
函数名 | 描述 |
---|---|
星号* | 矩阵元素相乘 |
np.dot(a,b) 或 a.dot(b) | 矩阵相乘 |
np.argmin | 返回矩阵中最小值的索引 |
np.argmax | 返回矩阵中最大值的索引 |
np.mean()或array.mean | 返回矩阵中平均值 |
np.average | 返回矩阵中平均值,可以算加权算术平均值 |
np.median | 求中位数 |
np.cumsum | 累加矩阵 |
np.diff | 沿着指定轴计算第N维的离散差值 |
np.sort | 对数组或数组某一维度进行就地排序 |
np.abs | 逐个元素进行绝对值计算 |
np.fabs | 复数的绝对值计算 |
np.sqrt | 平方根 |
np.square | 平方 |
np.exp | 自然指数函数 |
np.log | e为底的对数 |
np.log10 | 10为底的对数 |
np.log2 | 2为底的对数 |
np.sign | 计算每个元素的符号值 |
np.add | 将数组的对应元素相加 |
np.subtract | 在第二个数组中,将第一个数组中包含的元素去除 |
np.multiply | 将数组的对应元素相乘 |
np.divide | 相除 |
np.floor_divide | 整除,放弃余数 |
np.power | 幂函数 |
np.maxium | 逐个元素计算最大值 |
np.minimum | 逐个元素计算最小值 |
np.mod | 按元素进行求模运算 |
函数 | 描述 |
---|---|
np.ravel() | 平铺数组成为一维数组 |
np.reshape() | 调整形状 |
array.T | 返回array的转置数组 |
np.vstack((a,b)) | 垂直方向的合并 |
np.hstack((a,b)) | 水平方向的合并 |
np.concatenate((m,n),axis= ) | 数组拼接(默认是 axis = 0,对0轴的数组对象进行纵向的拼接(横向的拼接沿着axis= 1方向)传入的数组必须满足在拼接方向axis轴上数组间的形状一致) |
a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.vstack((a,b)) #vertical stack 垂直方向的合并
d = np.hstack((a,b)) #horizontal 水平方向的合并
1
2
3
4
[[1 1 1]
[2 2 2]]
[1 1 1 2 2 2]
a = np.array([[1, 2], [5, 7]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
1
2
3
[[1, 2],
[5, 7],
[5, 6]]
Numpy的切片操作,默认是修改原数组的,而不是原生Python那样,以复制为主。对于多维数组,每个轴都有一个索引index,并以逗号分隔。
>>> b=np.array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
>>> b[2,3] # 第3行第4列的元素,注意索引从0开始计数
23
>>> b[0:5, 1] # 第二列中的每一行,注意区间的左闭合右开的特性
array([ 1, 11, 21, 31, 41])
>>> b[ : ,1] # 相当于上面的例子
array([ 1, 11, 21, 31, 41])
>>> b[1:3, : ] # 每一列的,第二行和第三行的元素
array([[10, 11, 12, 13],
[20, 21, 22, 23]])
>>> b[-1] #当给与的参数少于轴数时,其它的轴被认为是全选,比如这里获得最后一行,等同于b[-1,:]
array([40, 41, 42, 43])
在上面的最后例子中,省略了列的索引。有时候,它们会被写作这样的格式x[i,…]。三个连续的圆点,代表其它未给出的所有轴的索引。例如假设有数组x,它有5个轴,那么:
x[1,2,...]相当于x[1,2,:,:,:]
x[...,3]相当于x[:,:,:,:,3]
x[4,...,5,:]相当于x[4,:,:,5,:]
对多维数组进行迭代,可以使用flat和flatten(将数组转换为1-D)
其中flat()返回一个迭代器,flatten()返回一个1-D序列
a = np.arange(3,15).reshape(3,4)
for item in a.flat:
print(item)
print(a.flatten())
3
4
5
6
7
8
9
10
11
12
13
14
[ 3 4 5 6 7 8 9 10 11 12 13 14]
对于数组的添加删除去重操作是很简单的,其中
函数 | 描述 |
---|---|
np.append | 将值添加到数组末尾 |
np.insert | 沿指定轴将值插入到指定下标之前 |
np.delete | 返回删掉某个轴的子数组的新数组 |
np.unique | 寻找数组内的唯一元素 |
函数 | 描述 |
---|---|
np.split(array,indices_or_sections,axis=0) | 指定分隔符对字符串进行切片 |
np.hsplit(array,indices_or_sections,axis=0) | 指定分隔符对字符串进行水平方向切片 |
np. vsplit(array,indices_or_sections) | 指定分隔符对字符串进行垂直方向切片 |
np. dsplit(array,indices_or_sections) | 对矩阵沿深度方向切片 |
np.array_split(array,indices_or_sections) | 对矩阵进行不等分的切片 |
copy方法生成数组的一个完整的深度拷贝,包括其数据。
a = np.arange(12).reshape((3,4))
b = a.copy()
b[0][0] = 12
print(b)
[[12 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
使用布尔数组进行索引,其实就是我们显式地选择数组中需要哪些项,不需要哪些项。可以使用与原始数组形状相同的布尔数组进行筛选过滤。
>>> a = np.arange(12).reshape(3,4)
>>> b = a > 4
>>> b # 通过比较运算,b变成了一个由布尔值组成的数组
array([[False, False, False, False],
[False, True, True, True],
[ True, True, True, True]])
>>> a[b] # 生成一个由True值对应出来的一维数组
array([ 5, 6, 7, 8, 9, 10, 11])
[参考文档]
http://www.liujiangblog.com/course/data/201
https://blog.csdn.net/ggfujfdd/article/details/90738582