人工智能 Tonsor 张量 创建和转换

张量从 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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值