张量从 0,1,2,3…
三维的张量,
1.创建张量的方式
- torch.tensor()根据指定数据创建张量
- torch.Tensor()根据形状创建张量,其也可用来创建指定数据的张量
⒉创建线性和随机张量
- torch.arrange()和torch.linspace()创建线性张量
- torch.randn()创建随机张量
3.创建01张量
- torch.ones()创建全1张量
- torch.zeros()创建全0张量
- torch.full()创建全为指定值张量
4.张量元素类型转换
- data.type(torch.DoubleTensor)
- data.double()
5.Tensor 转 ndarray
- torch.tensor([2,3,4]).numpy()
6.ndarray 转 Tensor
- torch.tensor(data)
- torch.from_numpy(data))
7.获取一个值的标量
- data = torch.tensor(10)
- print(data.item()) #只能通过item() 获取
8.张量的点加减乘除取负号∶
- add、sub、mul、div、neg(neg是符号反转,+ 或者 -)
- add_. sub_. mul_.div_.neg_(其中带下划线的版本会修改原数据)
9.张量的乘积运算
- print(a1 @ a2)
- print(torch.matmul(a1, a2))
10 张量运算函数
sum,mean,sqrt,pow,exp,lag等
11 张量的索引
- data = torch.randint(0, 10, [4, 5])
- print(data[0, 2])
- print(data[[0, 1], [1, 2]])
- print(data[1:]) # 获取下标为1行的后面的包括本身 反之 print(data[:1]) 就是获取下标为一行前面的不包括本身
- print(data[1:, :3]) # 取1行以后,每行前3的张量
- print(data[[[0], [1]], [1, 3]]) # 取第0行和第1行,下标是 1和3位置的数组 共4个值
12 多维索引
print(data[0, :, :]) # 共 3个值 第一个值是取第一个矩阵,
print(data[:, 0, :]) # 第二个值取 3个矩阵的第0行
print(data[:, :, 0]) # 第三个值取3个矩阵的 第0列
13 张量的形状调整
- print(data.shape)
- print(data.size())
- print(data.reshape(2, 10)) # 将矩阵(张量)45 变成210
- print(data.reshape(5, 4)) # 将矩阵(张量)45 变成54
- print(data.is_contiguous()) # 判断是否是连续内存,如果是True 才可以使用view函数
- print(data.view(2, 10))#view的功能和reshape一样,但是view必须在连续内存中,reshape可以再非连续内存。可能存在效率问题。再使用view
14 降为 升位
- x = torch.randn(1, 2, 1, 4, 6) # torch.Size([1, 2, 1, 4, 6])
- torch.unsqueeze(x, dim=0).shape # 从0的位置添加一个维度 torch.Size([2, 4, 6])
- torch.unsqueeze(x, dim=1).shape # 1 从第一的位置添加一个维度 torch.Size([1, 2, 4, 6])
- orch.unsqueeze(x, dim=-1).shape # -1 是从尾部加一个维度 torch.Size([2, 4, 6, 1])
15 维度交换 transpose 交换2个,permute交换多个
- x = torch.tensor(np.random.randint(0, 10, [3, 4, 5]))
- x.shape # torch.Size([3, 4, 5])
- torch.transpose(x, 1, 2).shape #维度 1和2进行了交换 torch.Size([3, 5, 4])
- torch.permute(x, [2, 0, 1]).shape #多维度交换按照数组顺序交换 torch.Size([5, 3, 4])
测试代码
import torch
import numpy as np
# ======= 创建张量==========
# 张量 Tensor 的两种创建方式 小写的torch.tensor
print(torch.tensor(10))
# tensor(10)
print(torch.tensor(np.random.randn(2, 3)))
# tensor([[ 0.4798, -0.3475, -0.1929],
# [-0.6836, 1.1279, -0.3356]], dtype=torch.float64)
print(torch.tensor([[2, 3, 4], [3, 4, 5]]))
# tensor([[2, 3, 4],
# [3, 4, 5]])
# 张量 Tensor 的第二种创建方式 大写的torch.Tensor
print(torch.Tensor(10))
print(torch.Tensor([10]))
print(torch.Tensor(2, 3))
print(torch.Tensor(np.random.randn(2, 3)))
# tensor([[ 0.4798, -0.3475, -0.1929],
# [-0.6836, 1.1279, -0.3356]], dtype=torch.float64)
print(torch.Tensor([[2, 3, 4], [3, 4, 5]]))
# 创建线性张量 0-10 步长2
print(torch.arange(0, 10, 2))
# tensor([0, 2, 4, 6, 8])
# 创建线性张量 0-10 均分8个值
print(torch.linspace(0, 10, 8))
# tensor([ 0.0000, 1.4286, 2.8571, 4.2857, 5.7143, 7.1429, 8.5714, 10.0000])
# 创建全0张量
print(torch.zeros(2, 3))
# 创建全1张量
print(torch.ones(2, 3))
# 创建全3张量 前面是形状,后面是值
print(torch.full([2, 3], 3))
# 创建一个 0-10 的 2,3的张量
torch.randint(0, 10, [2, 3], dtype=torch.float64)
# ========类型转换=========
# int 转 double 方法一 。double
int1 = torch.full([2, 3], 3)
print(int1.dtype);
double1 = int1.double();
print(double1.dtype);
int2 = double1.int()
print(int2.dtype)
# 或者
double3 = int1.type(torch.DoubleTensor);
print(double3.dtype)
int3 = double3.type(torch.IntTensor);
print(int3.dtype)
# 5.Tensor 转 ndarray
data = torch.tensor([2, 3])
data_numpy = data.numpy()
print(type(data))
print(type(data_numpy))
# 6.ndarray 转 Tensor
data = np.array([2, 3, 4]);
print(type(data))
print(type(torch.tensor(data))) #方法1
print(type(torch.from_numpy(data))) #方法2
# 获取一个值的标量
data = torch.tensor(10)
print(data.item()) #只有一个值的时候,只能通过item() 来获取
# 张量的加减乘除取负号∶ 这里只举add和neg,其他的用法和add一样。
a1 = torch.tensor([[2, 3], [4, 5]])
a2 = torch.tensor([2, 3])
print(a1, a2, a1.add(a2)) # 或者 print(a1, a2, a1 + a2)
print(a1, a2, a1.add_(a2)) # a1 会变成 [[4,9],[8,15]]
print(a1, a1.neg_(), a1.neg()) # neg 乘以-1
# 9 张量的加减乘除取负号∶ 这里只举加法,其他的举一反三
a1 = torch.tensor([[2, 3], [4, 5]])
a2 = torch.tensor([2, 3])
print(a1)
print(a2)
print("=============")
print(a1 * a2) # tensor([[ 4, 9],[ 8, 15]])
print("=============")
print(a1 @ a2) # tensor([13, 23])
print(torch.matmul(a1, a2)) # tensor([13, 23])
# 10 张量运算函数
data = torch.randint(0, 10, [2, 3], dtype=torch.float64)
print(data)
print(data.mean())
print(data.sum())
print(torch.pow(data, 2))
print(data.sqrt())
print(data.exp())
print(data.log())
print(data.log2())
print(data.log10())
# 11 张量的索引
data = torch.randint(0, 10, [4, 5])
print(data)
print(data[0])
print(data[0, 2])
print(data[[0, 1], [1, 2]])
print(data[1:]) # 获取下标为1行的后面的包括本身 反之 print(data[:1]) 就是获取下标为一行前面的不包括本身
print(data[1:, :3]) # 取1行以后,每行前3的张量
print(data[[[0], [1]], [1, 3]]) # 取第0行和第1行,下标是 1和3位置的数组 共4个值
# 12 多维索引
data = torch.randint(0, 10, [3, 3, 3])
print(data)
print(data[0, :, :]) # 共 3个值 第一个值是取第一个矩阵,
print(data[:, 0, :]) # 第二个值取 3个矩阵的第0行
print(data[:, :, 0]) # 第三个值取3个矩阵的 第0列
# 13 张量的形状调整
print("===========张量的形状调整==============")
print(data.shape)
print(data.size())
print(data.reshape(2, 10)) # 将矩阵(张量)4*5 变成2*10
print(data.reshape(5, 4)) # 将矩阵(张量)4*5 变成5*4
print(data.view(2, 10))#view的功能和reshape一样,但是view必须在连续内存中,reshape可以再非连续内存。可能存在效率问题。
print("===========降为 升位==============")
x = torch.randn(1, 2, 1, 4, 6) # shape [1, 2, 1, 4]
x.shape
x.squeeze().shape # 移除所有大小为1的轴 → shape [2, 4, 6]
# torch.Size([1, 2, 1, 4, 6])
torch.unsqueeze(x, dim=0).shape # 从0的位置添加一个维度
# torch.Size([2, 4, 6])
torch.unsqueeze(x, dim=1).shape # 1 从第一的位置添加一个维度
# torch.Size([1, 2, 4, 6])
torch.unsqueeze(x, dim=-1).shape # -1 是从尾部加一个维度
# torch.Size([2, 4, 6, 1])
# 维度交换 transpose 交换2个,permute交换多个
x = torch.tensor(np.random.randint(0, 10, [3, 4, 5]))
x.shape # torch.Size([3, 4, 5])
torch.transpose(x, 1, 2).shape # torch.Size([3, 5, 4])
torch.permute(x, [2, 0, 1]).shape # torch.Size([5, 3, 4])
# torch.cat()
data1 = torch.randint(0, 10, [2, 2, 2])
data2 = torch.randint(0, 10, [2, 2, 2])
# 1. 按0维度拼接
print(data1.shape)
new_data = torch.cat([data1, data2], dim=0)
print('dim=0', new_data.shape)
# # 2. 按1维度拼接 dim=0 torch.Size([4, 2, 2])
new_data = torch.cat([data1, data2], dim=1)
print('dim=1', new_data.shape)
# # 3. 按2维度拼接 dim=1 torch.Size([2, 4, 2])
new_data = torch.cat([data1, data2], dim=2)
print('dim=2', new_data.shape) # dim=2 torch.Size([2, 2, 4])