用Python处理数据(一)—— NumPy数组学习
优点:
1.基于向量化的运算
2.数组运算时numpy数组比list效率高
(我用的是jupyter notebook)
创建一维数组:
用到的函数: arange(x)
生成一个从0到(x-1)的包含x个元素的一维数组
创建多维数组:
用到的函数: array()
将输入转化为ndarray(N维数组对象(矩阵),所有元素必须是相同类型)
或者:
再或者用到scipy:
scipy 是一种使用numpy来做高等数学、信号处理、优化、统计的扩展包
显示数组形状
用数组的shape属性;
例如一维数组:
二维数组:
选择数组元素
通过a[m,n]形式选择元素(一维数组就不用说了),注意是从0开始;
numpy数值类型
类型 | 说明 |
---|---|
bool | 布尔型(值为True或者False),占用1比特 |
inti | 其长度取决于平台的整数(通常int32或者int64) |
int8 | 字节类型(-128~127) |
int16 | 整型(-32768~32767) |
int32 | 整型(-2^31~2^31-1) |
int64 | 整型(-2^63~2^63-1) |
uint16 | 无符号整型(0~65535) |
uint32 | 无符号整型(0~2^32-1) |
uint64 | 无符号整型(0~2^64-1) |
float16 | 半精度浮点型:符号占用1比特,指数占用5比特,尾数占用10比特 |
float32 | 单精度浮点型:符号占用1比特,指数占用8比特,尾数占用23比特 |
float64或者float | 双精度浮点型:符号占用1比特,指数占用11比特,尾数占用52比特 |
complex64 | 复数类型,由两个32位浮点型(实部和虚部)表示 |
complex128或者complex | 复数类型,由两个64位浮点数(实部和虚部)表示 |
dtype属性
一维数组的切片与索引
切片
与Python列表的切片一样:
索引
与Python列表的索引一样:
一维数组索引
二维数组索引
处理数组形状
1.改为指定数组形状
(1)reshape() 函数:
reshape(n,m,p)表示将数组改为n个m乘p数组
(2)resize()函数
resize()函数和reshape()函数类似,但是会改变所作用的数组
(3)用元组指定数组形状
2.将多维数组转化为一维数组
(1)拆解:ravel()函数
ravel()函数默认降维时行序优先,但是可以给一个参数让列序优先。
(2)拉直:flatten()函数
flatten()函数和ravel()一样默认降维时行序优先,但是可以给一个参数让列序优先。
ravel() 函数和 flatten() 函数的区别:
ravel()只是返回数组的视图,会改变原来的数组;flatten()函数返回的是真实的数组,需要分配新的内存空间
3.数组转置
(1)narray.T()函数:
(2)transpose()函数:
4.数组堆叠
(1)水平叠加:用元组确定ndarrays数组的形状,然后由hstack()函数来码放这些数组
PS:用concatenate()函数也能达到同样的效果,参数axis=1
(2)垂直叠加:先构建一个元组,然后用vstack()函数来码放
PS:用concatenate()函数也能达到同样的效果,参数axis=0
(3)列式堆叠:用column_stack()函数以列的方式对一维数组进行堆叠
PS:用这种方法堆叠二维数组时,过程类似于hstack()函数
(4)行式堆叠:用row_stack()函数以列的方式对一维数组进行堆叠
PS:用这种方法堆叠二维数组时,过程类似于vstack()函数
(5)深度叠加:沿着第三个坐标轴(纵向)的方向来叠加一摞数组,就像在一个数据图像的二维数组上叠加另一幅图像的数据
5.数组的拆分
(1)横向拆分:用hsplit()函数沿着横轴方向将数组拆分(即x轴)
PS:用split()函数也能达到同样的效果,参数axis=1
(2)纵向拆分:用vsplit()函数沿着纵轴方向将数组拆分(即y轴)
PS:用split()函数也能达到同样的效果,参数axis=0
(3)深向拆分:用dsplit()函数沿着深度方向将数组拆分(即z轴)
6.numpy数组的一些属性
ndim属性:储存维度数量
size属性:保存元素数量
itemsize属性:返回各个元素所占字节
nbytes属性:储存整个数组所需字节数量
7.数组的转换
转换为列表
用astype()函数转换为指定类型
转化为int类型时虚部会被丢掉,所以会报错。
花式索引
花式索引是在一个内部的numpy迭代器对象的基础上实现的。
下图利用花式索引将照片上的对角线置0;