paddlepaddle学习笔记2
前言
从之前的房价预测的实际演练中,我们发现在完成深度学习模型的过程中,第三方库numpy是极其重要的。所以在此处记录一下numpy的学习过程
ndarray数组的矢量性质
- ndarray数组中所有元素的数据类型相同、数据地址连续,批量操作数组元素时速度更快。而list列表中元素的数据类型可能不同,需要通过寻址方式找到下一个元素。
- ndarray数组支持广播机制,矩阵运算时不需要写for循环。
- NumPy底层使用C语言编写,内置并行计算功能,运行速度高于Python代码。
# Python原生的list
# 假设有两个list
a = [1, 2, 3, 4, 5]
b = [2, 3, 4, 5, 6]
# 完成如下计算
# 对a的每个元素 + 1
# a = a + 1 不能这么写,会报错
# a[:] = a[:] + 1 也不能这么写,也会报错
for i in range(5):
a[i] = a[i] + 1
如果使用ndarry实现同样的效果:
import numpy as np
a = np.array([1,2,3,4,5])
a+=1
输出结果为:array([2,3,4,5,6])
以及假如要实现两个list的相加:
# 计算 a和b中对应位置元素的和,是否可以这么写?
a = [1, 2, 3, 4, 5]
b = [2, 3, 4, 5, 6]
# 使用for循环,完成两个list对应位置元素相加
c = []
for i in range(5):
c.append(a[i] + b[i])
不难看出对于list中的任何元素都要进行for循环才能进行操作但是ndarry就可以直接利用矢量性质一步到位
# 使用numpy中的ndarray完成两个ndarray相加
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 3, 4, 5, 6])
c = a + b
ndarry数组的广播机制
以下代码为例,不难看出,ndarry在进行一维和二维数组的相加的时候,会将一维数组广播到二维数组按位相加
# 自动广播机制,1维数组和2维数组相加
# 二维数组维度 2x5
# array([[ 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10]])
d = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
# c是一维数组,维度5
# array([ 4, 6, 8, 10, 12])
c = np.array([ 4, 6, 8, 10, 12])
e = d + c
e
array([[ 5, 8, 11, 14, 17], [10, 13, 16, 19, 22]])
创建ndarry数组
创建ndarray数组最简单的方式就是使用array
函数,它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组。下面通过实例体会下array
、arange
、zeros
、ones
四个主要函数的用法。
array
:创建嵌套序列(比如由一组等长列表组成的列表),并转换为一个多维数组。
# 导入numpy
import numpy as np
# 从list创建array
a = [1,2,3,4,5,6] # 创建简单的列表
b = np.array(a) # 将列表转换为数组
b
array([1, 2, 3, 4, 5, 6])
arange
:创建元素从0到10依次递增2的数组。np.arange(开始,结束,步长)
# 通过np.arange创建
# 通过指定start, stop (不包括stop),interval来产生一个1维的ndarray
a = np.arange(0, 10, 2)
a
array([0, 2, 4, 6, 8])
zeros
:创建指定长度或者形状的全0数组。np.zeros([一维array的数量,一个一维array中有多少个元素])
# 创建全0的ndarray
a = np.zeros([3,4])
a
array([[0., 0., 0.,0.], [0., 0., 0.,0.], [0., 0., 0.,0.]])
ones
:创建指定长度或者形状的全1数组。与上边同理,只是其中的单个元素0换为1
# 创建全1的ndarray
a = np.ones([3,3])
a
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
ndarry数组的属性
ndarray的属性包括shape
、dtype
、size
和ndim
等,通过如下代码可以查看ndarray数组的属性。
shape
:数组的形状 ndarray.shape,1维数组(N, ),二维数组(M, N),三维数组(M, N, K)。dtype
:数组的数据类型。(数据类型一般有:int\float64\double等)size
:数组中包含的元素个数 ndarray.size,其大小等于各个维度的长度的乘积。(所有的元素的数量)ndim
:数组的维度大小,ndarray.ndim, 其大小等于ndarray.shape所包含元素的个数。
a = np.ones([3, 3])
print('a, dtype: {}, shape: {}, size: {}, ndim: {}'.format(a.dtype, a.shape, a.size, a.ndim))
运行结果:
a, dtype: float64, shape: (3, 3), size: 9, ndim: 2
ndarray数组的数据类型和形状
a.astype(np.int64) 强制类型转换
a.reshape([m,n]) 对元素切片为n行,每行有m个元素
#数据类型强制转换
a = np.ones([3,4])
b = a.astype(np.int64)
print('b, dtype: {}, shape: {}'.format(b.dtype,b.shape))
#改变ndarray形状
c = a.reshape([2,6])
print('c, dtype: {}, shape: {}'.format(c.dtype,c.shape))
运行结果:
b, dtype: int64, shape: (3, 4)
c, dtype: float64, shape: (2, 6)
ndarray数组的基本运算
标量和ndarray数组之间的运算
标量和ndarray数组之间的运算主要包括除法、乘法、加法和减法运算,具体代码如下所示。
# 标量除以数组,用标量除以数组的每一个元素
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
1. / arr
运行结果:
array([[1. , 0.5 , 0.33333333], [0.25 , 0.2 , 0.1666