pytorch中的tensor操作和numpy的array操作

文章目录

      • 0. tensor类型
      • 1. cpu,gpu, torch.tensor与numpy.array转换
      • 2. torch(tensor)&numpy(array)的min,max
      • 3. torch(tensor)&numpy(array)的索引异同
      • 4. torch(tensor)&numpy(array)的索引中的None
      • 5. expand, repeat

0. tensor类型

  1. tensor的类型:
torch.int32
torch.int64
torch.float32
torch.float64
  1. 查看tensor类型:
tensor.dtype
  1. 生成tensor
torch.tensor(1)
# 得到标量结果tensor(1)

torch.tensor((1,2,3))
# 得到向量结果tensor([1,2,3])
# 生成shape=torch.Size([1,2,3])的随机torch.int32类型的tensor
torch.IntTensor(*size, out=None)
# 使用
torch.IntTensor(1,2,3)
  
# 输出结果:
tensor([[[-734048928,      32757, -734048928],
         [     32757,         32,          0]]], dtype=torch.int32)
# 同理生成随机torch.float32类型的tensor
torch.FloatTensor(2,3,4,5)

torch.Tensor(2,3)默认是FloatTensor

随机生成tensor

# randn/rand不需要制定最大最小值
# 在[0,1)之间均匀分布
torch.rand(*size, out=None)  # 均匀分布
# 均值为0,方差为1的正太分布
torch.randn(*size, out=None)  # 正太分布

# 需要制定最大最小值
torch.randint(low, high, size)
torch,randint_like(input, low=0, high=None)
  1. tensor类型转换:
tensor.int()  # int32
tensor.long()  # int64
tensor.float()
tensor.double()

1. cpu,gpu, torch.tensor与numpy.array转换

  1. CPU tensor转GPU tensor:
cpu_imgs.cuda()
  1. GPU tensor 转CPU tensor:
gpu_imgs.cpu()
  1. numpy转为CPU tensor:
torch.from_numpy( imgs )
  1. CPU tensor转为numpy数据:
cpu_imgs.numpy()
  1. note:GPU tensor不能直接转为numpy数组,必须先转到CPU tensor。

  2. 如果tensor是标量的话,可以直接使用 item() 函数(只能是标量)将值取出来:

print loss_output.item()

2. torch(tensor)&numpy(array)的min,max

# 可以返回值和索引. numpy不可以.
min_value, min_index=tensor.min(dim=1)

3. torch(tensor)&numpy(array)的索引异同

1. torch,numpy都有这种索引方法, 其中range(6)可以用相应的列表代替.
x.shape(6,2,4)
x[range(6), np.array([0,1])]
x_t[range(6), torch.tensor([0,1]) ]
x_t[[0,1], [0,1]],意一样,但是取第一个维度的0,1; 然后取第二个维度的[0,1].注意这不是切片,这是可以随意间隔的取.

4. torch(tensor)&numpy(array)的索引中的None

# 采用None索引,相当于扩充维度
x = np.arange(12).reshape(6,2)
x_t = torch.tensor(x)
# Numpy array
x[None,:].shape  # (1,6,2)
x[:,None,:].shape  # (6,1,2)
x[:,:,None].shape  # (6,2,1)
# Torch tensor
x_t[None,:].shape  # torch.size([1,6,2])
x_t[:,None,:].shape  # torch.size([6,1,2])
x_t[:,:,None].shape  # torch.size([6,2,1])

5. expand, repeat

  1. expand()

返回当前张量在某维扩展更大后的张量。扩展(expand)张量不会分配新的内存,只是在存在的张量上创建一个新的视图(view),一个大小(size)等于1的维度扩展到更大的尺寸。也就是说,如果改变被扩展的张量,那么扩展部分和被扩展部分都会发生改变.

import torch

>> x = torch.tensor([1, 2, 3])
>> x.expand(2, 3) # 长度不为1的维度,要么置-1, 要么长度要相等.
tensor([[1, 2, 3],
        [1, 2, 3]])
        
>> x = torch.randn(2, 1, 1, 4)
>> x.expand(-1, 2, 3, -1)
torch.Size([2, 2, 3, 4])
  1. repeat()

沿着特定的维度重复这个张量,和expand()不同的是,这个函数拷贝张量的数据。

import torch

>> x = torch.tensor([1, 2, 3])
>> x.repeat(3, 2)
tensor([[1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3]])

>> x2 = torch.randn(2, 3, 4)
>> x2.repeat(2, 1, 3).shape
torch.Tensor([4, 3, 12])

你可能感兴趣的:(Pytorch,numpy,python,深度学习,pytorch)