【Pytorch】Tensor基本操作

【Pytorch】Tensor基本操作

  • 一、Tensor概述
  • 二、Tensor张量的定义
    • tensor基本定义
    • 获取tensor大小
  • 三、生成Tensor
    • 定义全0的tensor
    • 定义随机tensor
    • 定义未初始化数据的张量
    • arange方法生成tensor
  • 四、Numpy 数据转换
    • tensor转numpy格式
    • numpy转tensor格式
  • 五、tenso运算操作
    • 加法
    • 减法
    • 乘法
    • 除法
  • 六、tensor维度变换
    • unsqueeze方法
    • squeeze方法
    • cat方法
  • 七、tensor索引

一、Tensor概述

PyTorch里面处理的最基本的操作对象就是Tensor(张量),它表示的是一个多维矩阵,在使用上和numpy是对应的

Tensor的基本数据类型有五种:

  • 32位浮点型:torch.FloatTensor。pyorch.Tensor()默认的就是这种类型。
  • 64位整型:torch.LongTensor。
  • 32位整型:torch.IntTensor。
  • 16位整型:torch.ShortTensor。
  • 64位浮点型:torch.DoubleTensor。

二、Tensor张量的定义

tensor基本定义

import torch
from torch import tensor
# 定义0维Tensor
a = tensor(10)
# 定义1维Tensor
b = torch.IntTensor([1,2,3])
# 定义2维Tensor
c = torch.Tensor([[1, 2], [3, 4], [5, 6]])
# 定义3维Tensor
d = tensor([[[1, 2], [3, 4], [5, 6]],[[1, 2], [3, 4], [5, 6]]])
print(a)
print(b)
print(c)
print(d)

输出结果:

tensor(10)
tensor([1, 2, 3], dtype=torch.int32)
tensor([[1., 2.],
        [3., 4.],
        [5., 6.]])
tensor([[[1, 2],
         [3, 4],
         [5, 6]],

        [[1, 2],
         [3, 4],
         [5, 6]]])

获取tensor大小

# 获取矩阵的大小
print(d.size())
print(d.shape)

输出结果

torch.Size([2, 3, 2])
torch.Size([2, 3, 2])
获取0维tensor的值
a.item()

三、生成Tensor

定义全0的tensor

# 定义一个53列的全为0的矩阵
a = torch.zeros(5,3,dtype=torch.double)
print(a)

输出

tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]], dtype=torch.float64)

定义随机tensor

# 定义一个53列的随机值矩阵
x = torch.randn(5, 3)
print(x)

输出

tensor([[ 1.3276,  1.0624, -1.3002],
        [-0.8084,  1.0612, -0.9558],
        [ 1.2273, -0.0903, -0.9187],
        [-0.2024,  0.0736, -1.3670],
        [ 2.6466,  0.2927,  0.1307]])

定义未初始化数据的张量

# 定义未初始化数据的张量
x = torch.empty(5,3)
print(x)

输出

tensor([[1.0286e-38, 1.0653e-38, 1.0194e-38],
        [8.4490e-39, 1.0469e-38, 9.3674e-39],
        [9.9184e-39, 8.7245e-39, 9.2755e-39],
        [8.9082e-39, 9.9184e-39, 8.4490e-39],
        [9.6429e-39, 1.0653e-38, 1.0469e-38]])

# 定义未初始化数据的张量,torch.FloatTensor类型的张量
x = torch.Tensor(5, 3)
print(x)

输出

tensor([[9.9184e-39, 9.0919e-39, 1.0561e-38],
        [4.2246e-39, 1.0286e-38, 1.0653e-38],
        [1.0194e-38, 8.4490e-39, 1.0469e-38],
        [9.3674e-39, 9.9184e-39, 8.7245e-39],
        [9.2755e-39, 8.9082e-39, 9.9184e-39]])

arange方法生成tensor

# 使用torch.arange()生成张量
torch.arange(start=0, end = 11, step=2)

输出

tensor([ 0,  2,  4,  6,  8, 10])

# 在范围内生成固定数量的等间隔张量
torch.linspace(start = 1, end = 10, steps=5)

输出

tensor([ 1.0000,  3.2500,  5.5000,  7.7500, 10.0000])

四、Numpy 数据转换

tensor转numpy格式

import torch
import numpy as np
 
# 定义一个32列的全为0的矩阵
b = torch.randn((3, 2))

# tensor转化为numpy
numpy_b = b.numpy()
print(numpy_b)

输出

[[-0.27381065  0.43861285]
 [ 1.0121734   0.4847141 ]
 [ 2.6019974  -0.65572333]]

numpy转tensor格式

# numpy转化为tensor
numpy_e = np.array([[1, 2], [3, 4], [5, 6]])
torch_e = torch.from_numpy(numpy_e)
 
print(numpy_e)
print(torch_e)

输出

[[1 2]
 [3 4]
 [5 6]]
tensor([[1, 2],
        [3, 4],
        [5, 6]], dtype=torch.int32)

五、tenso运算操作

加法

import torch
import numpy as np
x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x + y)

输出

tensor([[ 2.,  4.],
        [ 6.,  8.],
        [10., 12.]])

print(torch.add(x, y))

输出

tensor([[ 2.,  4.],
        [ 6.,  8.],
        [10., 12.]])

减法

x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x - y)

输出

tensor([[0., 0.],
        [0., 0.],
        [0., 0.]])

乘法

x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x * y)

输出

tensor([[ 1.,  4.],
        [ 9., 16.],
        [25., 36.]])

除法

x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x / y)
print(torch.div(x, y))
tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])

六、tensor维度变换

# 转成34列的2维tensor
A = torch.arange(12.0).reshape(3,4)
A

输出

tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]])

## 使用torch.reshape()
torch.reshape(input = A,shape = (2,-1))
tensor([[ 0.,  1.,  2.,  3.,  4.,  5.],
        [ 6.,  7.,  8.,  9., 10., 11.]])

unsqueeze方法

## torch.unsqueeze()返回在指定维度插入尺寸为1的新张量
A = torch.arange(12.0).reshape(2,6)
B = torch.unsqueeze(A,dim = 0)
B.shape

输出

torch.Size([1, 2, 6])

squeeze方法

## torch.squeeze()函数移除所有维度为1的维度
C = B.unsqueeze(dim = 3)
print("C.shape : ",C.shape)
D = torch.squeeze(C)
print("D.shape : ",D.shape)
## 移除指定维度为1的维度
E = torch.squeeze(C,dim = 0)
print("E.shape : ",E.shape)

输出

C.shape :  torch.Size([1, 2, 6, 1])
D.shape :  torch.Size([2, 6])
E.shape :  torch.Size([2, 6, 1])

cat方法

## 在给定维度中连接给定的张量序列
A = torch.arange(6.0).reshape(2,3)
B = torch.linspace(0,10,6).reshape(2,3)
print(A)
print(B)
## 在0纬度连接张量
C = torch.cat((A,B),dim=0)
C

输出

tensor([[0., 1., 2.],
        [3., 4., 5.]])
tensor([[ 0.,  2.,  4.],
        [ 6.,  8., 10.]])
tensor([[ 0.,  1.,  2.],
        [ 3.,  4.,  5.],
        [ 0.,  2.,  4.],
        [ 6.,  8., 10.]])

七、tensor索引

## 利用切片和索引获取张量中的元素
A = torch.arange(12).reshape(1,3,4)
A

输出

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]]])

A[0]

输出

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])

## 获取第0维度下的矩阵前两行元素
A[0,0:2,:]

输出

tensor([[0, 1, 2, 3],
        [4, 5, 6, 7]])

## 获取第0维度下的矩阵,最后一行-4~-1A[0,-1,-4:-1]

输出

tensor([ 8,  9, 10])

八、tensor统计相关的计算

## 1维张量的最大值和最小值
A = torch.tensor([12.,34,25,11,67,32,29,30,99,55,23,44])
## 最大值及位置
print("最大值:",A.max())
print("最大值位置:",A.argmax())
## 最小值及位置
print("最小值:",A.min())
print("最小值位置:",A.argmin())

输出

最大值: tensor(99.)
最大值位置: tensor(8)
最小值: tensor(11.)
最小值位置: tensor(3)

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