pytorch基础 一、numpy基础

pytorch从入门到SJ“入魔”

 一、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.改变数组的形状

numpy中改变向量形状的一些函数:
函数 描述
arr.reshape 改变向量维度,不改变向量本身
arr.resize 改变向量维度,改变向量本身
arr.T 对向量进行转置
arr.ravel 对向量展平,即将多维数组变成1维,不会产生原数组的副本
arr.flatten 对向量展平,即将多维数组变成1维,返回原数组的副本
arr.squeeze **只能对维数为1的维度降维。**对多维数组使用不会产生影响
arr.transpose 对高维矩阵队形轴兑换

具体使用示例:

2.合并数组

Numpy中数组合并方法
函数 描述
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中的函数可以是向量或矩阵,而利用向量或矩阵可以避免使用循环语句,这点在机器学习、深度学习中非常重要。

Numpy中常用的几个通用函数
函数 使用方法
sqrt 计算序列化数据的平方根
sin, cos 三角函数
abs 绝对值
dot 矩阵运算
log, log10, log2 对数
exp 指数
cumsum, cumproduct 累计求和、求积
sum 求和
mean 求均值
median 求中位数
std 求标准差
var 求方差
corrcoef 求相关系数

具体使用示例:

猜你喜欢

转载自blog.csdn.net/yishuihanq/article/details/109587318