pytorch从入门到“入魔”
一、numpy基础
Python本身含有列表(list)和数组(array),但对于大数据来说,这些结构是有很多不足的。
list的元素可以是任何对象,因此列表中所保存的是对象的指针。
array对象可以直接保存数值,但是由于它不支持多维,在上面的函数也不多,因此也不适合做数值运算。
Numpy提供了两种基本的对象:
- ndarray(N-dimensional Array Object)
- ufunc(Universal Function Object)
ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
Numpy的主要特点
- ndarray,快速节省空间的多维数组,提供数组化的算术运算和高级的广播功能。
- 使用标准数学函数对整个数组的数据进行快速运算,且不需要编写循环。
- 读取/写入磁盘上的阵列数据和操作存储器映像文件的工具。
- 线性代数、随机数生成和傅里叶变换的能力。
Numpy主要内容
- 如何生成Numpy数组。
- 如何存取元素。
- Numpy的算术运算。
- 数组变形。
- 批量处理。
- Numpy的通用函数。
- Numpy的广播机制。
生成Numpy数组
1.从已有数据中创建数组
直接对Python的基础数据类型(如列表、元组等)进行转换来生成ndarray:
# 导入numpy
import numpy as np
# 生成numpy数组
# 从已有数据中创建数组
# 1)将列表转换成ndarray
lst1 = [3.14, 2.17, 0, 1 , 2]
nd1 = np.array(lst1)
print(nd1)
#输出结果为: [3.14 2.17 0. 1. 2. ]
print("数据类型为:",type(nd1))
#输出结果为:数据类型为: <class 'numpy.ndarray'>
# 2)嵌套列表可以转成多维ndarray
# import numpy as np
lst2 = [[3.14, 2.17, 0, 1, 2], [1, 2, 3, 4, 5]]
nd2 = np.array(lst2)
print(nd2)
#输出结果为: [[3.14 2.17 0. 1. 2. ]
# [1. 2. 3. 4. 5. ]]
print("数据类型为:",type(nd2))
#输出结果为:数据类型为: <class 'numpy.ndarray'>
2..利用random模块生成数组
np.random 模块常用函数:
函数 | 描述 |
---|---|
np.random.random | 0到1之间随机数 |
np.random.uniform | 均匀分布的随机数 |
np.random.randn | 标准正态分布的随机数 |
np.random.normal | 正态分布 |
np.random.randint | 随机整数 |
np.random.shuffle | 随机打乱顺序 |
np.random.seed | 设置随机数种子 |
random_sample | 生成随机的浮点数 |
具体使用实例:
# 利用random模块生成数组
# 导入numpy
import numpy as np
# 生成0~1之间的随机数
nd3 = np.random.random([3,3])
print("生成3*3的矩阵数据:\n",nd3)
# 生成3*3的矩阵数据:
# [[0.48614176 0.27868547 0.50392416]
# [0.71698562 0.51553353 0.37778331]
# [0.20340666 0.57332978 0.46538621]]
print("nd3的形状为:",nd3.shape)
# nd3的形状为:(3, 3)
# 为了每次都生成同一份数据,可以指定一个随机种子,使用shuffle函数打乱生成的随机数。
# import numpy as np
# 指定随机种子
np.random.seed(123)
# 生成标准正态的随机数
nd4 = np.random.randn(2,3)
print("nd4: ", nd4)
# nd4: [[-1.0856306 0.99734545 0.2829785 ]
# [-1.50629471 -0.57860025 1.65143654]]
# 随机打乱数据
np.random.shuffle(nd4)
print("随机打乱后的数据: ")
print(nd4)
print("数据类型为:",type(nd4))
# 随机打乱后的数据:
# [[-1.50629471 -0.57860025 1.65143654]
# [-1.0856306 0.99734545 0.2829785 ]]
# 数据类型为: <class 'numpy.ndarray'>
3.创建特定形状的多维数组
参数初始化时,有时需要生成一些特殊矩阵,如全是0或1的数组或矩阵,这时我们可以利用np.zeros、np.ones、np.diag来实现。
函数 | 描述 |
---|---|
np.zeros((3,4)) | 创建3 x 4的元素全为0的数组 |
np.ones((3,4)) | 创建3 x 4的元素全为1的数组 |
np.empty((2,3)) | 创建2 x 3的空数组,但是空数据中的值不是0,是未初始化的垃圾值 |
np.zeros_like(ndarr) | 以ndarr 相同维度创建元素全为0数组 |
np.ones_like(ndarr) | 以ndarr 相同维度创建元素全为1数组 |
np.empty_like(ndarr) | 以ndarr 相同维度创建空数组 |
np.eye(5) | 创建一个5 x 5矩阵,对角线为1,其余为0 |
np.full((3,5), 666) | 创建3 x 5的元素全为666的数组 |
具体使用示例:
数组变形
由于不同模型所接收的输入格式不一样,往往需要先对其进行一系列的变形和运算,从而将数据处理成模型要求的格式。在矩阵或者数组的运算中,经常会遇到需要把多个向量或矩阵按某轴方向合并,或展平(如在卷积或循环神经网络中,在全连接层之前,需要把矩阵展平)的情况。
1.改变数组的形状
函数 | 描述 |
---|---|
arr.reshape | 改变向量维度,不改变向量本身 |
arr.resize | 改变向量维度,改变向量本身 |
arr.T | 对向量进行转置 |
arr.ravel | 对向量展平,即将多维数组变成1维,不会产生原数组的副本 |
arr.flatten | 对向量展平,即将多维数组变成1维,返回原数组的副本 |
arr.squeeze | **只能对维数为1的维度降维。**对多维数组使用不会产生影响 |
arr.transpose | 对高维矩阵队形轴兑换 |
具体使用示例:
2.合并数组
函数 | 描述 |
---|---|
np.append | 内存占用大 |
np.concatenate | 没有内存问题 |
np.stack | 沿着新的轴加入一系列数组 |
np.hstack | 堆栈数组垂直顺序(行) |
np.vstack | 堆栈数组垂直顺序(列) |
np.dstack | 堆栈数组按顺序深入(沿第3维) |
np.vsplit | 将数组分解成垂直的多个子数组的列表 |
注意:
- append,concatenate以及stack都有一个axis参数,用于控制数组的合并方式是按行还是按列。
- 对于append和concatenate,待合并的数组必须有相同的行数或列数。
- stack,hstack,dstack要求待合并的数组要有相同形状。
具体使用示例:
通用函数
Numpy的另一个对象通用函数(ufunc,universal function),它是一种能对数组的每个元素进行操作的函数。
许多ufunc函数都是用C语言级别实现的,因此它们的计算速度非常快。
此外,它们比math模块中的函数更灵活。math模块的输入一般是标量,但Numpy中的函数可以是向量或矩阵,而利用向量或矩阵可以避免使用循环语句,这点在机器学习、深度学习中非常重要。
函数 | 使用方法 |
---|---|
sqrt | 计算序列化数据的平方根 |
sin, cos | 三角函数 |
abs | 绝对值 |
dot | 矩阵运算 |
log, log10, log2 | 对数 |
exp | 指数 |
cumsum, cumproduct | 累计求和、求积 |
sum | 求和 |
mean | 求均值 |
median | 求中位数 |
std | 求标准差 |
var | 求方差 |
corrcoef | 求相关系数 |
具体使用示例: