PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)

简介: PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)

需要源代码文件请点赞关注收藏后评论区留言私信~~~

一、张量模块

张量(Tensor)是PyTorch最基本的操作对象,是具有统一类型的多维数组。大家对标量、向量和矩阵都非常熟悉,但是当我们想描述一个高维数据时,标量、向量和矩阵有些“力不从心”,因此,张量应运而生

在几何定义中,张量是基于标量、向量和矩阵概念的延伸。通俗一点理解,可以将标量视为0维张量,向量视为1维张量,矩阵视为2维张量。在深度学习领域可以将张量视为一个数据的水桶,当水桶中只放一滴水时就是0维张量,多滴水排成一排就是1维张量,联排成面就是2维张量,以此类推,扩展到n维张量

像 Python 数值和字符串一样,所有张量都是不可变的:永远无法更新张量的内容,只能创建新的张量

1:张量的数据类型

创建张量

生成随机数

torch.rand():生成服从均匀分布的随机数;

torch.randn():生成服从标准正太分布的随机数;

torch.normal():指定均值和标准差的正太分布的随机数;

torch.linspace():生成均匀间隔的随机数;

torch.manual_seed():用来固定随机种子,生成相同的随机数;

torch.ones()、torch.zeros()、torch.eye()

下面是上面基本操作的代码

import torch
# 从python数组构建
a = [[1, 2, 3],[4, 5, 6]]
x = torch.Tensor(a)
print(a, x)
# 输出结果为:
# tensor([[1., 2., 3.],
#         [4., 5., 6.]])
# 从列表构建张量
x = torch.Tensor([[1, 2]])
print(x)
# 输出结果为:
# tensor([[1., 2.]])
tensor1 = torch.rand(4)
tensor2 = torch.rand(2, 3)
print(tensor1, tensor2)
# tensor([0.7638, 0.3919, 0.9474, 0.6846]) 
# tensor([[0.3425, 0.0689, 0.6304],
#         [0.5676, 0.8049, 0.3459]])
tensor1 = torch.randn(5)
tensor2 = torch.randn(2, 4)
print(tensor1, tensor2)
# tensor([ 0.4315, -0.3812, 0.9554, -0.8051, -0.9421]) 
# tensor([[-0.6991, 0.0359, 1.2298, -0.1711],
#         [ 1.0056, 0.5772, 1.4460, -0.5936]])
tensor = torch.normal(mean=torch.arange(1., 11.), std= torch.arange(1, 0, -0.1))
print(tensor)
# tensor([0.0605, 2.5965, 3.3046, 4.2056, 5.0117, 6.7848, 6.3024, 7.9845, 9.4306, 9.7881])
torch.arange(1, 0, -0.1)
tensor = torch.normal(mean=0.5, std=torch.arange(1., 6.))
print(tensor)
# tensor([-0.0757, -0.5302, -1.1334, -4.3958, -5.8655])
tensor = torch.normal(mean=torch.arange(1., 6.), std=1.0)
print(tensor)
# tensor([1.6546, 2.7788, 2.4560, 3.2527, 4.1715])
tensor = torch.normal(2, 3, size=(1, 4))
print(tensor)
# tensor([[ 4.7555, -2.5026, -1.6333, -0.9256]])
tensor = torch.linspace(1, 10, steps=5)
print(tensor)
# tensor([ 1.0000,  3.2500,  5.5000,  7.7500, 10.0000])
torch.manual_seed(1)
temp1 = torch.rand(5)
print(temp1)  # tensor([0.7576, 0.2793, 0.4031, 0.7347, 0.0293])
torch.manual_seed(1)
temp2 = torch.rand(5)
print(temp2)  # tensor([0.7576, 0.2793, 0.4031, 0.7347, 0.0293])
temp3 = torch.rand(5)
print(temp3)  # tensor([0.7999, 0.3971, 0.7544, 0.5695, 0.4388])
tensor1 = torch.zeros(2, 3)
tensor2 = torch.ones(2, 3)
tensor3 = torch.eye(3)
print(tensor1, tensor2, tensor3)
# tensor([[0., 0., 0.],
#         [0., 0., 0.]]) 
#         tensor([[1., 1., 1.],
#         [1., 1., 1.]]) 
#         tensor([[1., 0., 0.],
#         [0., 1., 0.],
#         [0., 0., 1.]])
# 第一种方法:在创建张量时指定数据类型
x = torch.ones((2, 3, 4), dtype=torch.int64)  # 生成全1数组
print(x)
# 输出结果为:
# tensor([[[1, 1, 1, 1],
#          [1, 1, 1, 1],
#          [1, 1, 1, 1]],
# 
#         [[1, 1, 1, 1],
#          [1, 1, 1, 1],
#          [1, 1, 1, 1]]])
# 第二种方法:张量创建完成后,对数据类型进行转换
x = torch.ones(2, 3, 4)  # 生成全1数组
x = x.type(torch.int64)
print(x)
# 输出结果为:
# tensor([[[1, 1, 1, 1],
#          [1, 1, 1, 1],
#          [1, 1, 1, 1]],
# 
#         [[1, 1, 1, 1],
#          [1, 1, 1, 1],

2:张量的基本操作

改变张量的形状

x = torch.rand(3, 2)
print(x.shape)  # torch.Size([3, 2])
y = x.view(2, 3)
print(y.shape)  # torch.Size([6])

增加和删除维度

# 增加维度
a = torch.rand(3, 4)
b = torch.unsqueeze(a, 0)
c = a.unsqueeze(0)
print(b.shape)  # torch.Size([1, 3, 4])
print(c.shape)  # torch.Size([1, 3, 4])

交换维度

# 删除维度
a = torch.rand(1, 1, 3, 4)
b = torch.squeeze(a)
c = a.squeeze(1)
print(b.shape)  # torch.Size([3, 4])
print(c.shape)  # torch.Size([1, 3, 4])

拼接和分割

# torch.cat()拼接方法的代码如下:
a = torch.rand(1, 2)
b = torch.rand(1, 2)
c = torch.rand(1, 2)
output1 = torch.cat([a, b, c], dim=0)  # dim=0为按列拼接
print(output1.shape)  # torch.Size([3, 2])
output2 = torch.cat([a, b, c], dim=1)  # dim=1为按行拼接
print(output2.shape)  # torch.Size([1, 6])

堆叠和分解

# torch.stack()堆叠方法的代码如下:
a = torch.rand(1, 2)
b = torch.rand(1, 2)
c = torch.rand(1, 2)
output1 = torch.stack([a, b, c], dim=0)  # dim=0为按列拼接
print(output1.shape)  # torch.Size([3, 1, 2])
output2 = torch.stack([a, b, c], dim=1)  # dim=1为按行拼接
print(output2.shape)  # torch.Size([1, 3, 2])
# torch.chunk()分解方法的代码如下:
a = torch.rand(3, 4)
output1 = torch.chunk(a, 2, dim=0)
print(output1)
# (tensor([[0.1943, 0.1760, 0.3022, 0.0746],
#         [0.5819, 0.7897, 0.2581, 0.0709]]), tensor([[0.2137, 0.5694, 0.1406, 0.0052]]))
output2 = torch.chunk(a, 2, dim=1)
print(output2)
# (tensor([[0.1943, 0.1760],
#         [0.5819, 0.7897],
#         [0.2137, 0.5694]]), tensor([[0.3022, 0.0746],
#         [0.2581, 0.0709],
#         [0.1406, 0.0052]]))

索引和切片

x = torch.rand(2, 3, 4)
print(x[1].shape)  # torch.Size([3, 4])
y = x[1, 0:2, :]
print(y.shape)  # torch.Size([2, 4])
z = x[:, 0, ::2]
print(z.shape)  # torch.Size([2, 2])

下面是基本的数学运算

元素求和 按索引求和 元素乘积 求平均数 求方差 求最大值 求最小值

# 元素求和第一种方法
a = torch.rand(4, 3)
b = torch.sum(a)
print(b)  # tensor(6.4069)
# 元素求和第二种方法
a = torch.rand(4, 3)
b = torch.sum(a, dim=1, keepdim=False)
print(b, b.shape)
# tensor([[0.6594],
#         [1.5325],
#         [1.5375],
#         [1.7755]]) torch.Size([4, 1])
# 按索引求和,不常用
x = torch.Tensor([[1, 2],[3, 4]])
y = torch.Tensor([[3, 4],[5, 6]])
index = torch.LongTensor([0, 1])
output = x.index_add_(0, index, y)
print(output)
# tensor([[ 4.,  6.],
#         [ 8., 10.]])
# 元素乘积第一种方法
a = torch.rand(4, 3)
b = torch.prod(a)
print(b)  # tensor(2.0311e-05)
# 元素乘积第二种方法
a = torch.rand(4, 3)
b = torch.prod(a, 1, True)
print(b, b.shape)
# tensor([[0.0194],
#         [0.1845],
#         [0.0336],
#         [0.4879]]) torch.Size([4, 1])
# 求平均数的第一种方法
a = torch.rand(4, 3)
b = torch.mean(a)
print(b)  # tensor(0.4836)
# 求平均数的第二种方法
a = torch.rand(4, 3)
b = torch.mean(a, 1, True)
print(b, b.shape)
# tensor([[0.6966],
#         [0.6087],
#         [0.3842],
#         [0.1749]]) torch.Size([4, 1])
# 求方差的第一种方法
a = torch.rand(4, 3)
b = torch.var(a)
print(b)  # tensor(0.0740)
# 求方差的第二种方法
a = torch.rand(4, 3)
b = torch.var(a, 1, True)
print(b, b.shape)
# tensor([0.1155, 0.0874, 0.0354, 0.0005]) torch.Size([4, 1])
# 求最大值的第一种方法
a = torch.rand(4, 3)
b = torch.max(a)
print(b)  # tensor(0.8765)
# 求最大值的第二种方法
a = torch.rand(4, 3)
b = torch.max(a, 1, True)
print(b)
# torch.return_types.max(
# values = tensor([[0.9875],
#          [0.6657],
#          [0.9412],
#          [0.7775]]),
# indices = tensor([[2],
#           [0],
#           [0],
#           [1]]))
# 求最小值的第一种方法
a = torch.rand(4,3)
b = torch.min(a)
print(b)  # tensor(0.0397)
# 求最小值的第二种方法
a = torch.rand(4, 3)
b = torch.min(a, 1, True)
print(b)
# torch.return_types.min(
# values = tensor([[0.0436],
#           [0.1586],
#           [0.4904],
#           [0.2536]]),
# indices = tensor([[0],
#           [1],
#           [2],
#           [1]]))

向量运算和矩阵运算

包括向量的点乘 向量的叉乘 矩阵的内积 矩阵的外积

# 向量的点乘,a和b必须为一维
a = torch.Tensor([1, 2, 3])
b = torch.Tensor([1, 1, 1])
output = torch.dot(a, b)
print(output)  # 等价于 1*1+2*1+3*1,tensor(6.)
# 向量的叉乘
a = torch.Tensor([1, 2, 3])
b = torch.Tensor([1, 1, 1])
output = torch.multiply(a, b)
print(output)  # tensor([1., 2., 3.])
# 矩阵的内积
a = torch.Tensor([1, 2, 3])
b = torch.Tensor([1, 1, 1])
output = torch.inner(a, b)
print(output)  # tensor(6.)
# 矩阵的外积:矩阵乘法
a = torch.Tensor([[1, 2, 3], [4, 5, 6]])
b = torch.Tensor([[1, 1], [2, 2], [3, 3]])
output = torch.matmul(a, b)
print(output)
# tensor([[14., 14.],
#         [32., 32.]])
# 按批量相乘
a = torch.randn(10, 3, 4)
b = torch.randn(10, 4, 5)
output = torch.bmm(a, b)
print(output.shape)
# tensor([[14., 14.],
#         [32., 32.]])

3:张量与Numpy数组

由于使用numpy中ndarray处理数据非常方便,经常会将张量与numpy数组进行相互转换,所以掌握两者之间的转换方法很有必要

张量转numpy数组:tensor.numpy()

Numpy数组转张量:torch.from_numpy()

张量转Numpy数组

a = torch.ones(1, 2)
b = a.numpy()  # 进行转换
print(a, b)  # tensor([[1., 1.]]) [[1. 1.]]
a += 2
print(a, b)  # tensor([[3., 3.]]) [[3. 3.]]
b += 2  # 在a改变后,b也已经改变
print(a, b)  # tensor([[5., 5.]]) [[5. 5.]]

Numpy数组转张量

import numpy as np
a = np.ones([1, 2])
b = torch.from_numpy(a)  # 进行转换
print(a, b)  # [[1. 1.]] tensor([[1., 1.]], dtype=torch.float64)
a += 2
print(a, b)  # [[3. 3.]] tensor([[3., 3.]], dtype=torch.float64)
b += 2  # 在a改变后,b也已经改变
print(a, b)  # [[5. 5.]] tensor([[5., 5.]], dtype=torch.float64)

4:Cuda张量与CPU张量

在深度学习过程中,GPU能起到加速作用。Pytorch中的张量默认存放在CPU设备中,如果GPU可用,可以将张量转移到GPU中

x = torch.rand(2, 4)
print(x.device)  # cpu
# 第一种方法
x = x.cuda()
print(x.device)  # cuda:0
# 第二种方法
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
if torch.cuda.is_available():
    x = x.to(device)
    print(x.device)  #cuda:0
# 转化为cpu
x = x.cpu()
print(x.device)  # cpu

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
1月前
|
PyTorch 算法框架/工具 Python
Pytorch学习笔记(十):Torch对张量的计算、Numpy对数组的计算、它们之间的转换
这篇文章是关于PyTorch张量和Numpy数组的计算方法及其相互转换的详细学习笔记。
33 0
|
1月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
154 0
|
4月前
|
存储 C语言 Python
NumPy 教程 之 NumPy 数据类型 10
NumPy的`dtype`对象详细描述数组数据,包括类型(如整数、浮点、对象)、大小、字节顺序和结构化字段信息。构造`dtype`时可指定对齐和是否复制。例如,定义一个结构化类型`student`含字符串`name`、整数`age`和浮点数`marks`,然后创建一个数组应用该类型,输出显示结构化数据内容。
41 5
|
4月前
|
存储 C语言 Python
NumPy 教程 之 NumPy 数据类型 11
NumPy的`dtype`对象详细描述数组数据的类型、大小、字节顺序及结构。它支持布尔、整数、浮点、复数、时间和日期类型等,与C语言类型相似。通过`numpy.dtype`构造,可指定对齐和复制。每个类型有唯一字符标识,如'b'代表布尔,'i'代表有符号整数,'f'代表浮点数,'c'代表复数,'S'和'U'表示字符串,'V'表示原始数据。字节顺序用'<'或'>'标记。
26 2
|
4月前
|
存储 C语言 Python
NumPy 教程 之 NumPy 数据类型 6
NumPy的`dtype`对象详细描述数组数据,包括类型(如整数、浮点数)、大小、字节顺序和结构化类型字段。构造`dtype`使用`numpy.dtype()`,参数可指定数据类型、对齐和复制选项。实例展示了创建结构化类型`dt`,含一个`int8`类型的'age'字段,输出为`[('age', 'i1')]`。
24 1
|
4月前
|
C语言 索引 Python
NumPy 教程 之 NumPy 数据类型 1
NumPy 提供丰富数据类型,如 bool_、int_(类似 C 的 long)、intc、intp(用于索引)、int8-64 和 uint8-64(无符号整数)。浮点型有 float16-64,以及复数类型 complex64 和 complex128。每个类型对应特定字节数和精度。dtype 对象代表这些类型。
28 1
|
5月前
|
存储 机器学习/深度学习 PyTorch
Pytorch-张量形状操作
PyTorch中,张量形状操作至关重要,如reshape用于改变维度而不变元素,transpose/permute用于维度交换,view改形状需内存连续,squeeze移除单维度,unsqueeze添加维度。这些函数帮助数据适应神经网络层间的转换。例如,reshape能调整数据适配层的输入,transpose用于矩阵转置或多维排列,而squeeze和unsqueeze则用于处理单维度。理解并熟练运用这些工具是深度学习中必要的技能。
|
4月前
|
存储 C语言 Python
NumPy 教程 之 NumPy 数据类型 9
NumPy的`dtype`对象详细描述数组数据,包括类型(如整数、浮点数)、大小、字节顺序和结构化类型字段。可通过`numpy.dtype()`创建,参数包括数据类型对象、对齐标志和复制选项。例如,定义一个结构化类型`student`,含`name`(字符串)、`age`(整数)和`marks`(浮点数)字段,展示了如何应用到数组。打印`student`显示字段及其类型。
27 0
|
4月前
|
数据处理 Python
数据科学进阶之路:Pandas与NumPy高级操作详解与实战演练
【7月更文挑战第13天】探索数据科学:Pandas与NumPy提升效率的高级技巧** - Pandas的`query`, `loc`和`groupby`用于复杂筛选和分组聚合,例如筛选2023年销售额超1000的记录并按类别计总销售额。 - NumPy的广播和向量化运算加速大规模数据处理,如快速计算两个大数组的元素级乘积。 - Pandas DataFrame基于NumPy,二者协同加速数据处理,如将DataFrame列转换为NumPy数组进行标准化再回写,避免链式赋值。 掌握这些高级操作,实现数据科学项目的效率飞跃。
58 0
|
4月前
|
存储 C语言 Python
NumPy 教程 之 NumPy 数据类型 3
NumPy 扩展了Python的数据类型,提供dtype对象描述数组内存布局,包括数据类型、大小、字节顺序等。dtype通过`numpy.dtype()`创建,如`np.dtype(np.int32)`,并支持结构化类型和子数组。字节顺序用`<`(小端)或`>`(大端)指定。
20 0

相关实验场景

更多