为什么要向量化
在深度学习安全领域、深度学习练习中,你经常发现在训练大量数据时,深度学习算法表现才更加优越,所以你的代码运行的非常快至关重要,否则,你将要等待非常长的时间去得到结果。所以在深度学习领域向量化是一个关键技巧。
正常虽然可以通过for循环完成一些基本的操作,但是这样会导致运行效率大打折扣,这时候运用矩阵运算,引入Numpy,可以一定程度上提高代码的运行效率。
要记住,经验法则是当你编写新的网络时,或者你做的只是回归,那么一定要尽量避免for循环,能不用就不用。如果你可以使用内置函数,或者找出其他方法去计算循环,通常会比直接用for循环更快。
what is Numpy?
1.一个开源的Python科学计算库
2.使用Numpy可以方便的使用数组,矩阵进行计算
3.包含线性代数,傅里叶变换,随机数生成等大量函数
Numpy 的优点
代码更简洁:Numpy直接以数组,矩阵为粒度(一个单元)计算并且支持大量的数学函数,而python需要用for循环从底层实现
性能更高效:Numpy的数组存储效率和输入输出计算性能,比python使用list或者嵌套list好很多注:Numpy的数据存储和python原生的list是不一样的注:Numpy的大部分代码都是c语言实现的,这是Numpy比纯python代码高效的原因
这里主要介绍一下array
array一维数组
一般来说,array基本是所有程序语言都有的一种基础线性结构,元素以特定的顺序存储在一段连续的内存中。Python的array只能存储数值和字符。
要使用array之前需要先引入,操作如下
#从numpy中引用arrayimport numpy as npnp.array()
创建方式如下
# 需要提供一个类型代码字符来指示存储何种元素# 以及一个可迭代对象来填充元素array.array(typecode[, initializer])# array所有的类型代码字符print(array.typecodes)bBuhHiIlLqQfd# 创建一个存储整型的arrayarr = array('i', [1,2,3,4,5,6])
类型码(typecode)有以下几种
array二维数组
使用python的list和嵌套list创建一维的array和二维的array
创建方式如下
# 创建一个一维的数组,也就是python的单元素list
x=np.array([1,2,3,4,5,6,7,8])
# 创建一个二维的数组,也就是python的嵌套list
X=np.array([[1,2,3,4],[5,6,7,8]])
关于array的便捷函数
<1>.使用arange创建数字序列
arange([起始值(取得到)],[终止值(取不到)],[步长],dtype=None)
print(np.arange(10))#创建一个0-10的一维数组(取不到10)
print(np.arange(2,10,2))#创建一个2-10,步长为2的一维数组(取不到10)
运行结果
<2>使用ones创建单位数组
np.ones(shape,dtype=None,order=‘C’)
shape:int or tuple of ints Shape of the new array . eg:(2,3) or 2
dtype:数据类型,默认的是自己从输入的数据自动获得
order:有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序print(np.ones(10))#创建一个一行十列的单位数组
print(np.ones((2,3)))#创建一个二行三列的单位数组
运行结果
<3>使用ones_like创建与某个数组形状相同的单位数组
print(np.ones_like(x))#创建一个和x相同形状的单位数组
print(np.ones_like(X))#创建一个和X相同形状的单位数组
print(np.ones_like([2,3]))#创建一个和[2,3]数组形状相同的单位数组
print(np.ones_like([[1,2,3],[4,5,6]]))#创建一个和[[1,2,3],[4,5,6]]数组形状相同的单位数组
运行结果
<4>使用zeros创建全是0的数组
print(np.zeros(3))#创建一个一行三列的零数组
print(np.zeros((2,4)))#创建一个二行四列的零数组
运行结果
<5>使用full创建指定值的数组
print(np.full(4,9))#创建一个一行四列,元素为9的数组
print(np.full((2,3),9))#创建一个二行三列,元素为9的数组
运行结果
<6>使用random模块生成随机数的数组
print(np.random.randn())#生成一个随机数
print(np.random.randn(3))#随机生成一个一行三列的数组,这也生成的秩为1的数组,既不是行向量也不是列向量。尽量不用这种数据结构
print(np.random.randn(3,1))print(np.random.randn(2,3))#随机生成一个二行三列的数组
print(np.random.randn(2,3,4))#随机生成一个三维的数组,有两块三行四列的数组组成
运行结果
np.random.rand():
该函数旨在输出0~1的正态分布随机数。
其参数可以是1个,也可以是多个。
函数内部可以不写参数,默认为1,输出1个随机数。
np.random.rand(d0,d1,d2……dn)
注:使用方法与np.random.randn()函数相同
作用:
通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。
还有许多函数,本文无法完全涉及,用到再查即可。