自学内容网 自学内容网

深度学习—Numpy数组库基础

Numpy是python中用于数组处理的一个库,让python有了比肩matlab的矩阵处理能力,因为其应用广泛,加上深度学习大多是对矩阵数据的处理,pytorch中对张量处理的tensor方法几乎照搬了该库,所以对Numpy的学习基本是深度学习绕不开的一个基础栈。

通常导入使用import numpy as np并将别名起为np,创建数组的方法为arr=np.arry([向量或矩阵]),一次使用示例如下:
创建数组
可以看到array数组中的数据不以逗号,分割,也避免了和小数点.的混淆。

类型与形状

Numpy还顺带解决了一个问题,python本身的列表可以存储多种数据,这在存储时会造成浪费,故Numpy规定,一个数组中只能存储一种类型的数据,我们使用中多只分为整型和浮点型两种。

python既然是一个弱类型的语言,我们何必区分数据的类型呢?
在使用中该原理确实有要注意的地方——个人改变不了集体,具体体现为整型数据插入浮点数组会自动升级为浮点型,这无可厚非,无非多占用些内存,而浮点型数据进入整型数组会自动转为整型,这会导致浮点型数据截断,造成程序的误差。

由此还派生出另一个推论——共同改变定理,数组的数据类型如果要改变必须同时一起改变。
规范情况下,我们手动要实现数据转化可以使用arr.astype(数据类型)方法。

有些函数需要我们传入数组的形状参数,我们使用的一维数组格式为(x),二维数组为(x,y),三维数组为(x,y,z),使用函数生成值全为1的方法展示如下:
形状展示
参数中后面的值代表其低纬度数据个数,其参数表示为(y,x)(z,y,x)更为直观。

创建数组

根据创建数组值的要求,主要有以下四种方法:
1,直接转化。手动输入矩阵并转化为数组,套一次[]就增加一维,文章开头展示的方法就是直接转化,生成三维数组的方法展示如下:
三维数组生成

2,递增数组。使用np.range(起点,终点,步长)的方法生成递增数组,示例展示如下:
生成递增数组
3,同值数组。生成一个全为一个值的数组,np.zeros(形状)生成全0数组,np.ones(形状)生成全1数组,在类型与形状中已经展示过。

4,随机数组。根据范围和类型生成随机值的数组:
np.random(形状)生成0-1均匀分布的数组;
np.random.randint(起点,终点,形状)生成范围内的整型数组
np.random.normal(均值,标准差,形状)生成符合正态分布的数组
生成随机数组

访问数组

和数组的访问类似,可用[]访问,可用-负号倒着访问,用,区分行列
访问示例
多维数据可用多层[]花式访问,例如两层[x][y]访问二维数组中位置为x,y的数据,由原本[行,列]的形式转变为[[行],[列]],且一次可以取出多个值。
花式索引
同时也可以使用数组中切片访问[起点:终点:步长]的方法,其中起点或终点可缺省为空,表示一直到开始或结束,该方法可用于提取矩阵的特定行或列,取出的列会自动转为向量,减少了[]的使用,可以极大节约内存,示例如下:
切片访问
为了节省内存,切片仅为试图,而非创建新的变量,对新赋值的变量进行修改会作用于原变量,而数组赋值也仅为绑定,同样不产生新变量,该现象展示如下:
视图赋值
可以看到对新变量arr1的修改作用于原arr,要想创建新的变量需使用.copy()方法复制,展示如下:
copy方法

数组变形

转置,只对矩阵有效,使用arr.T实现

翻转,上下翻转使用np.flipud(arr)左右翻转使用np.fliplr(arr),效果展示如下:
上下翻转

重塑,reshape(形状)方法实现,该方法在深度学习中很常用,将输入重塑为需要的形状,其中形状可用-1填充,实现自动计算,效果展示如下:
重塑
拼接,使用np.concatenate([数组],axis=0),默认以行拼接,设置为1表示按列拼接,该方法在拼接时需注意维度一致,效果展示如下:
拼接
分裂,使用np.split(目标数组,[截断位置],axis),返回分裂后的多个元素,效果展示如下:
分裂效果

数组运算

数组间的加减乘除运算均为逐元素的对应运算,示例如下:
逐元素运算
不同规格的矩阵或向量进行运算时会自动进行广播,低纬矩阵自动升级为高维进行运算,其中缺失的维度复制自身进行填充,效果展示如下:
广播机制
可以看到三维矩阵分别与同一个向量进行了三次运算。

数组函数

1,矩阵乘积。前面使用的乘法为对应位置逐元素相乘,要实现矩阵中行列的乘法需要使用np.dot()函数,效果展示如下:
矩阵乘积
2,数学函数。
绝对值:np.abs()

三角函数:np.sin()np.cos()np.tan()

指数函数:np.exp(x)

对数函数:np.log(x)默认以e为底,log(x)/log(2)可用除法实现以2为底的对数

聚合函数:
最值max(arr,axis)缺省时为整体求最值,最小用min
求和sum()
求积prod()
均值mean()
标准差std()

布尔数组

借助不等号创建,与限制条件比较后生成,示例如下:
生成布尔数组
该方法可用函数np.sum()获取值为true的个数,np.any()检验结果中是否有truenp.all()当结果全为true才返回truenp.where(限制条件)可返回索引元组,也可以将布尔数组作为掩码筛选过滤,效果展示如下:
掩码过滤

数组与张量

由于numpy应用广泛,torch库几乎照搬了其中的函数,大部分函数在torch中只需将np换为torcharray换为tensor即可。

总结

本章学习了深度学习基础的numpy库,包括其概念和类型,创建访问和运算方法,该库最主要的是给我们提供了矩阵运算的方法,在日后深度学习处理数据,尤其是对图像方面的应用会十分广泛。


原文地址:https://blog.csdn.net/weixin_46763552/article/details/143477742

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!