2.0 头文件

 

import torch

 

 

2.1 创建张量

 

# 创建一个一维包含12个元素,元素值为0~11的张量
x = torch.arange(12)
print(x)
# 输出:
# tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

# 查看张量的形状
print(x.shape)
# 输出:
# torch.Size([12])

# 查看张量中元素的个数
print(x.numel())
# 输出:
# 12

# 将张量形状改成3行4列
X = x.reshape(3, 4)
print(X)
# 输出:
# tensor([[ 0,  1,  2,  3],
#         [ 4,  5,  6,  7],
#         [ 8,  9, 10, 11]])

# 生成一个(2层,3行,4,列)的张量,元素全为0
X = torch.zeros((2, 3, 4))
print(X)
# 输出:
# tensor([[[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]],
#
#         [[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]]])

# 生成一个(2层,3行,4,列)的张量,元素全为1
X = torch.ones((2, 3, 4))
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.]]])

# 生成一个(3行,4列)的张量,每个元素服从标准正态分布
X = torch.randn(3, 4)
print(X)
# 输出:
# tensor([[ 0.9394,  0.6450,  0.5422, -0.1536],
#         [ 0.1569, -1.4045,  0.2541, -0.8207],
#         [ 1.0692, -1.4287,  0.3242,  0.7078]])

# 用python列表生成张量
X = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print(X)
# 输出:
# tensor([[2, 1, 4, 3],
#         [1, 2, 3, 4],
#         [4, 3, 2, 1]])

 

 

2.2 张量运算

# 逐元素的加减乘除幂
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])

# 加法
print(x + y)
# 输出:tensor([ 3.,  4.,  6., 10.])

# 减法
print(x - y)
# 输出:tensor([-1.,  0.,  2.,  6.])

# 乘法
print(x * y)
# 输出:tensor([ 2.,  4.,  8., 16.])

# 除法
print(x / y)
# 输出:tensor([0.5000, 1.0000, 2.0000, 4.0000])

# 求幂
print(x ** y)
# 输出:tensor([ 1.,  4., 16., 64.])

# 以e为底的指数
print(torch.exp(x))
# 输出:tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

# 张量拼接
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

print(torch.cat((X, Y), dim=0))     #按行拼接
# 输出:
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  6.,  7.],
#         [ 8.,  9., 10., 11.],
#         [ 2.,  1.,  4.,  3.],
#         [ 1.,  2.,  3.,  4.],
#         [ 4.,  3.,  2.,  1.]])

print(torch.cat((X, Y), dim=1))     #按列拼接
# 输出:
# tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
#         [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
#         [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])

# 逐元素判断张量是否相等
print(X == Y)
# 输出:
# tensor([[False,  True, False,  True],
#         [False, False, False, False],
#         [False, False, False, False]])

# 对张量中所有元素求和
print(X.sum())
# 输出:
# tensor(66.)

 

 

2.3 广播机制

# 上面是对两个形状相同的张量进行逐元素运算
# 对两个形状不同的张量执行逐元素运算之前,要先根据广播机制对张量进行扩充,使得两个张量具有相同的形状
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a + b)
# 输出:
# tensor([[0, 1],
#         [1, 2],
#         [2, 3]])
# a复制列,b复制行

 

2.4 切片和索引

X = torch.arange(12, dtype=torch.float32).reshape((3,4))

# 选择最后最后一个元素
print(X[-1])
# 输出:
# tensor([ 8.,  9., 10., 11.])

# 选择第二个和第三个元素
print(X[1:3])
# 输出:
# tensor([[ 4.,  5.,  6.,  7.],
#         [ 8.,  9., 10., 11.]])

# 修改第2行第3列的元素
# print(X[1, 2] = 9)
# 输出:
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  9.,  7.],
#         [ 8.,  9., 10., 11.]])

# 修改前两行的元素
X[0:2, :] = 12
print(X)
# 输出:
# tensor([[12., 12., 12., 12.],
#         [12., 12., 12., 12.],
#         [ 8.,  9., 10., 11.]])

 

2.5 张量和其他类型的转换

X = torch.arange(12, dtype=torch.float32).reshape((3,4))

# 将张量转换为ndarray
A = X.numpy()
print(A)
# 输出:
# [[ 0.  1.  2.  3.]
#  [ 4.  5.  6.  7.]
#  [ 8.  9. 10. 11.]]

# 将ndarray转换为张量
B = torch.tensor(A)
print(B)
# 输出:
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  6.,  7.],
#         [ 8.,  9., 10., 11.]])

# 将大小为1的张量转换为python标量
a = torch.tensor([3.5])
a.item()
print(float(a))     # 3.5
print(int(a))       # 3

 

本小节完整代码

import torch

# ------------------------------创建张量-------------------------------------
# 创建一个一维包含12个元素,元素值为0~11的张量
x = torch.arange(12)
print(x)
# 输出:
# tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

# 查看张量的形状
print(x.shape)
# 输出:
# torch.Size([12])

# 查看张量中元素的个数
print(x.numel())
# 输出:
# 12

# 将张量形状改成3行4列
X = x.reshape(3, 4)
print(X)
# 输出:
# tensor([[ 0,  1,  2,  3],
#         [ 4,  5,  6,  7],
#         [ 8,  9, 10, 11]])

# 生成一个(2层,3行,4,列)的张量,元素全为0
X = torch.zeros((2, 3, 4))
print(X)
# 输出:
# tensor([[[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]],
#
#         [[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]]])

# 生成一个(2层,3行,4,列)的张量,元素全为1
X = torch.ones((2, 3, 4))
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.]]])

# 生成一个(3行,4列)的张量,每个元素服从标准正态分布
X = torch.randn(3, 4)
print(X)
# 输出:
# tensor([[ 0.9394,  0.6450,  0.5422, -0.1536],
#         [ 0.1569, -1.4045,  0.2541, -0.8207],
#         [ 1.0692, -1.4287,  0.3242,  0.7078]])

# 用python列表生成张量
X = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
print(X)
# 输出:
# tensor([[2, 1, 4, 3],
#         [1, 2, 3, 4],
#         [4, 3, 2, 1]])


# ------------------------------张量运算-------------------------------------
# 逐元素的加减乘除幂
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])

# 加法
print(x + y)
# 输出:tensor([ 3.,  4.,  6., 10.])

# 减法
print(x - y)
# 输出:tensor([-1.,  0.,  2.,  6.])

# 乘法
print(x * y)
# 输出:tensor([ 2.,  4.,  8., 16.])

# 除法
print(x / y)
# 输出:tensor([0.5000, 1.0000, 2.0000, 4.0000])

# 求幂
print(x ** y)
# 输出:tensor([ 1.,  4., 16., 64.])

# 以e为底的指数
print(torch.exp(x))
# 输出:tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

# 张量拼接
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

print(torch.cat((X, Y), dim=0))     #按行拼接
# 输出:
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  6.,  7.],
#         [ 8.,  9., 10., 11.],
#         [ 2.,  1.,  4.,  3.],
#         [ 1.,  2.,  3.,  4.],
#         [ 4.,  3.,  2.,  1.]])

print(torch.cat((X, Y), dim=1))     #按列拼接
# 输出:
# tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
#         [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
#         [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])

# 逐元素判断张量是否相等
print(X == Y)
# 输出:
# tensor([[False,  True, False,  True],
#         [False, False, False, False],
#         [False, False, False, False]])

# 对张量中所有元素求和
print(X.sum())
# 输出:
# tensor(66.)

# ------------------------------广播机制-------------------------------------
# 上面是对两个形状相同的张量进行逐元素运算
# 对两个形状不同的张量执行逐元素运算之前,要先根据广播机制对张量进行扩充,使得两个张量具有相同的形状
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a + b)
# 输出:
# tensor([[0, 1],
#         [1, 2],
#         [2, 3]])
# a复制列,b复制行

# ------------------------------索引和切片-------------------------------------
X = torch.arange(12, dtype=torch.float32).reshape((3,4))

# 选择最后最后一个元素
print(X[-1])
# 输出:
# tensor([ 8.,  9., 10., 11.])

# 选择第二个和第三个元素
print(X[1:3])
# 输出:
# tensor([[ 4.,  5.,  6.,  7.],
#         [ 8.,  9., 10., 11.]])

# 修改第2行第3列的元素
# print(X[1, 2] = 9)
# 输出:
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  9.,  7.],
#         [ 8.,  9., 10., 11.]])

# 修改前两行的元素
X[0:2, :] = 12
print(X)
# 输出:
# tensor([[12., 12., 12., 12.],
#         [12., 12., 12., 12.],
#         [ 8.,  9., 10., 11.]])

# ------------------------------张量和其他类型的转换-------------------------------------
X = torch.arange(12, dtype=torch.float32).reshape((3,4))

# 将张量转换为ndarray
A = X.numpy()
print(A)
# 输出:
# [[ 0.  1.  2.  3.]
#  [ 4.  5.  6.  7.]
#  [ 8.  9. 10. 11.]]

# 将ndarray转换为张量
B = torch.tensor(A)
print(B)
# 输出:
# tensor([[ 0.,  1.,  2.,  3.],
#         [ 4.,  5.,  6.,  7.],
#         [ 8.,  9., 10., 11.]])

# 将大小为1的张量转换为python标量
a = torch.tensor([3.5])
a.item()
print(float(a))     # 3.5
print(int(a))       # 3

 

posted on 2022-11-01 10:04  yc-limitless  阅读(33)  评论(0编辑  收藏  举报