NumPy的主要特点
ndarray,快速,节省空间的多维数组,提供数组化的算术运算和高级的广播功能
导入NumPy
NumPy是外部库。首先要导人NumPy库。
import numpy as np
NumPy数组
生成NumPy数组,使用np.array()
,接收Python列表作为参数
通过arange创建数组:下例中创建一个0~1间隔为0.1的行向量,从0开始,不包括1
>>>np.array(0,1,0.1)
array([0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])
利用random模块生成ndarray
在深度学习中,我们经常需要对一些变量进行初始化,适当的初始化能提高模型的性能。通常用随机数生成模块random来生成,
random模块又分为多种函数:
random生成0到1之间的随机数;
uniform生成均匀分布随机数;
randn生成标准正态的随机数;
normal生成正态分布;
shuffle随机打乱顺序;
seed设置随机数种子。
例如:
import numpy as np
nd5 = np.random.random([3,3])
print(nd5)
print(type(nd5))
结果如下
[[ 0.88900951 0.47818541 0.91813526][ 0.48329167 0.63730656 0.14301479]
[ 0.9843789 0.99257093 0.24003961]]
创建特定形状的多维数组
数据初始化时,有时需要生成一些特殊矩阵,如0或1的数组或矩阵,这时我们可以利用np.zeros、np.ones、np.diag来实现,下面我们通过几个示例来说明。
#生成全是0的3x3矩阵
nd6 = np.zeros([3,3])
#生成全是1的3x3矩阵
nd7 = np.ones([3,3])
#生成3阶的单位矩阵
nd8= np.eye(3)
#生成3阶对角矩阵
print (np.diag([1, 2, 3]))
存取元素
>>>a = np.arange(10)
>>>print (a,'\n')
[0 1 2 3 4 5 6 7 8 9]
#简单的的切片课作,取0~4号元素,不包括5
>>>print('a[:5]=’,a[:5],‘\n')
a[:5]= [0 1 2 3 4]
#数组从后往前取
>>>print('a[:-1]=',a[:-1],’\n')
a[:-1]= [012345678]
#加入步长参数
>>>print('a[1:-1:2]=’,a[1:-1:2],’\n')
a[1:-1:2]= [1 3 5 7]
# 省略范围的开始下标和结束下标,步长为-1,整个数组头尾颠倒
>>>print('a[::-1]=’,a[::-1],'\n')
a[::-1]= [9 8 7 6 5 4 3 2 1 0]
# 步长为负数时,开始下标必须大于结束下标,下面步长为-2
>>>print( ‘a[5:1:-2]=’,a[5:1:-2])
a[5:1:-2]= [5 3]
矩阵操作
深度学习中经常涉及多维数组或矩阵的运算,正好NumPy模块提供了许多相关的计算方法,下面介绍一些常用的方法。
nd14=np.arange(9).reshape([3,3])
#矩阵转置
np.transpose(nd14)
#矩阵乘法运算
a=np.arange(12).reshape([3,4])
b=np.arange(8).reshape([4,2])
a.dot(b)
#求矩阵的迹
a.trace()
NumPy算术运算
>>>x= np.array([1.0,2.0, 3.0])
>>>y = np.array([2.0,4.0,6.0])
>>>x+y #对应元素的加法
array([ 3., 6., 9. ])
>>>x-y
array([ -1., -2.,-3.])
>>>x*y #element-wise product
array([ 2.. 8., 18.])
>>>x/y
array([ 0.5, 0.5,0.5])
数组x和数组y的元素个数是相同的,如果元亲个数不同,程序就会报错
element-wise product 表示“对应元素的乘法”
NumPy数组不仅可以进行element-wise运算,也可以和单一的数值(标量)组合起来进行运算
这个功能也被称为广播
>>>x = np.array([1.0,2.0,3.0])
>>>x/2.0
array([ 0.5,1.,1.5])
N维数组
NumPy可以生成多维数组,比如,可以生成如下的二维数组(矩阵)。
>>> A = np.array([[1,2],[3,4]])
矩阵A的形状可以通过shape查看
矩阵元素的数据类型可以通过dtype查看
>>>A.shape
(2,2)
>>>A.dtype
dtype('int64')
矩阵的算术运算也可以在相同形状的矩阵间以对应元素的方式进行。
数学上将一维数组称为向量
将二维数组称为矩阵
可以将一般化之后的向量或矩阵等称为张量
基本上将二维数组称为“矩阵”,将三维组及三维以上的数组称为“张量”或“多维数组”
广播
NumPy中,形状不同的数组之间也可以进行运算。
例如:将标量10被扩展(复制)成了2x2的形状,然后再与矩阵A进行乘法运算,这个巧妙的功能称为广播
因为NumPy有广播功能,所以不同形状的数组之间也可以进行运算。
访问元素
元素的索引从0开始。对各个元素的访问可按如下方式进行。
>>> X = np.array([[51,55],[14,19],[0,4]])
>>>X[0] #第0行
>>>X[0][1] #(0,1)的元紫
NumPy还可以使用数组访问各个元素。
>>> X=X.flatten() #将X转换为一维数组
>>> print(X)
[51 55 14 19 0 4]
>>> X[np,array([0,2,4])] # 获取索引为0、2、4的元素
array([51,14,0])
运用这个标记法,可以获取满足一定条件的元素。例如,要从x中抽出大于15的元素,可以写成如下形式。
>>>X>15
array([ True, True, False, True, False, False], dtype=bool)
>>>X[X>15]
array(151,55,191)
补充知识
Theano对于解决大量数据的问题,使用Theano可能获得与手工用C实现差不多的性能。
相关知识扩展:https://zhuanlan.zhihu.com/p/24218567