深度学习—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()
方法复制,展示如下:
数组变形
转置,只对矩阵有效,使用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()
检验结果中是否有true
,np.all()
当结果全为true
才返回true
,np.where(限制条件)
可返回索引元组,也可以将布尔数组作为掩码筛选过滤,效果展示如下:
数组与张量
由于numpy
应用广泛,torch
库几乎照搬了其中的函数,大部分函数在torch
中只需将np
换为torch
,array
换为tensor
即可。
总结
本章学习了深度学习基础的numpy
库,包括其概念和类型,创建访问和运算方法,该库最主要的是给我们提供了矩阵运算的方法,在日后深度学习处理数据,尤其是对图像方面的应用会十分广泛。
原文地址:https://blog.csdn.net/weixin_46763552/article/details/143477742
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!