Python自带的numpy是深度学习最常用的库之一,作为深度学习入门,只需要掌握创建数组、索引、类型转换、维度变换即可,其他在深度学习中不是很常用,等要用到的时候看看函数API就行。
1.创建数组
1.1 使用 ones,empty, zeros生成数组,形参shape=[2,3]为2行3列的维度
#in:
np.ones(shape=[2,3]) #[2,3]为2行3列的维度
#out:
array([[1., 1., 1.],
[1., 1., 1.]])
#in:
np.zeros(shape=[3,4])
#out:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
#in:
np.empty(shape=[4,5]) #随机生成
#out:
array([[2.47053687e-316, 6.27463370e-322, 0.00000000e+000,
0.00000000e+000, 1.78019625e-306],
[5.30276956e+180, 3.31033942e-033, 4.57487963e-071,
3.25824571e-086, 3.35560119e-143],
[6.01433264e+175, 6.93885958e+218, 5.56218858e+180,
3.94356143e+180, 7.18978022e-067],
[2.90327285e-057, 2.08799593e-076, 6.82201766e-067,
7.49078798e-144, 1.50008929e+248]])
1.2 使用linspace,arange生成数组(注意区间闭合)
#in:
np.linspace(0,99,10) #左闭右闭,等距生成数组,前两个数为区间,第三个数是步长
#out:
array([ 0., 11., 22., 33., 44., 55., 66., 77., 88., 99.])
#in:
np.arange(0,99,33) #左闭右开,第三个数是步长
#out:
array([ 0, 33, 66])
#in:
np.random.normal(0, 1, size=(8,10)) #在(0,1)区间随机生成维度为[8,10]的数组
#out:
array([[ 0.4889333 , 0.52598919, -1.1787282 , 0.92947144, -0.61411273,
-0.40308503, -0.24170964, -1.65005546, -1.10860983, -1.17195597],
[ 2.30153196, 0.08231435, -0.42151829, 0.23084481, -0.22912885,
0.35418584, 0.18042856, 0.50218664, -0.06535679, -1.08141255],
[ 0.78668497, 0.40467269, -2.15751968, -0.5284904 , 0.61413254,
0.38134191, -0.32608761, -0.80535812, -0.28665986, -0.46265705],
[ 0.40831628, 1.1195378 , -0.19555259, -1.26725678, 0.06050092,
-1.53074358, -0.46109896, 1.0585371 , -1.68785747, -0.38269948],
[ 0.2533123 , 0.7493127 , -0.39330055, 0.59872789, 1.23311894,
1.56123508, 0.88216884, -0.11006012, 1.67101912, 0.36773784],
[-0.01196778, -0.29989697, -0.10620468, 0.62047068, -0.35919101,
0.14259044, -0.77929073, 1.07955841, -0.57254166, -0.75650875],
[-0.38727358, 0.34665637, 0.28927818, 0.23179733, 0.22165409,
0.3740697 , -0.03544985, 0.34657169, -0.21841557, 1.18743025],
[-0.88678905, -1.13712659, 0.38860167, -0.43039802, -0.23007068,
1.49646142, -0.60181792, 2.09735673, -1.08618737, -1.09159316]])
1.3 生成服从某种函数分布的数组
均匀分布
#in:
np.random.uniform(-1,1,100000) #均匀分布,前两个数是区间,第三个数是个数
#out:
array([ 0.15119225, 0.40014323, -0.05461068, ..., -0.98073734,
0.75843808, 0.4539914 ])
正态分布
#in:
np.random.normal(1.8, 0.1, 100000) #参数分别是 对称轴,标准差,个数
#out:
array([1.64399767, 1.59405144, 1.92386876, ..., 1.85188776, 1.72408358,
1.82817792])
2 索引
1.1 一维数组
一维数组基本索引与Python列表(list)类似,如arr[0]
访问一维数组的第一个元素,arr[1:3]访问数组第1、2个元素
1.2 二维数组
二维数组列表与列表同样类似,需要两个索引号,并用逗号隔开。如:
arr[0][1]: 访问数组第一行第二个元素;
arr[0]:访问数组第一行所有元素,同arr[0, :];
arr[:, 1]: 访问所有行第2列的元素;
arr[0:4, 2:5]: 访问第1、2、3行,第3、4、5列的元素;
(注:0可以省略不写,索引号1代表第2行,多维数组以此类推)
3 类型转换
深度学习中,经常要对列表list、数组array、张量Tensor类型数据进行相互转换,以下是常用的转换函数:
3.1 numpy、Tensor互转
import numpy as np
import tensorflow as tf
import torch
arr = np.empty([3,4])
tf_arr = tf.convert_to_tensor(arr) #numpy转TensorFlow
arr = tf_arr.eval() #Tensorflow转numpy
torch_arr = torch.from_numpy(arr) #numpy转torch
arr = torch_arr.numpy() #torch转numpy
#注:tf2.0之后的版本,也支持tf.numpy()将Tensor转为numpy
3.2 numpy、list互转
list1 = [[1, 2], [3, 4], [5, 6]]
arr = np.array(list1) #list转numpy
list1 = arr.tolist() #numpy转list
4 维度变换
常用的维度变换函数为reshape、resize(无返回值)、flatten、ravel(无返回值)
#维度变换
data6 = np.random.normal(0, 1, size=(8,10)) #创建维度为(8,10)的随机数组
data6.reshape((10,8)) #有返回值,按原来的顺序重新分组,要求总数一致,维度变为(10,8),此时data6未改变
data6.resize((10,8)) #无返回值,会直接改变原数组data6
#拉平变换
data6 = np.random.normal(0, 1, size=(8,10)) #创建维度为(8,10)的随机数组
data6.flatten() #有返回值,按原来的顺序重新分组,要求总数一致,维度变为(n),此时data6未改变
data7 = data6.flatten() #不会报错,标准使用方法
data6.ravel() #无返回值,会直接改变原数组data6,data6被拉平
data7 = data6.ravel() #报错,因为ravel()函数无返回值