基于PyTorch的Tensor基本操作总结(一)

tensor的裁剪、索引、降维和增维看这里

目录

一、张量常用的数据类型:

二、Tensor的创建

(1)创建一个64位浮点型且指定矩阵值为[1,2],[3,4],[5,6]的矩阵:

(2)创建一个仅指定形状未赋值的Tensor:

(3)依据另一个Tensor的形状创建Tensor

(4)还有一些常用的创建Tensor的方法:

三、Tensor的尺寸、数据类型、长度查看

四、Tensor的形状调整

五、Tensor的加、减、乘、除、求幂、求绝对值

六、Tensor间比较

1、touch.equal()函数

2、touch.gt()、touch.ge()

七、tensor元素的最大、最小、和、平均数

八、Tensor与NumPy数组间互相装换

1、Tensor转NumPy

2、NumPy转Tensor

3、tensor与numpy数组互转方法总结


Pytorch最基本的操作对象是张量,张量的英文是Tensor

一、张量常用的数据类型:

        这里的数据类型可以理解是指此类型的张量的元素支持此类型的数据,就如32位浮点型张量,其元素数据类型就是32位的浮点数

数据类型

含义

torch.FloatTensor

32位浮点型(默认类型)

torch.DoubleTensor

64位浮点型

torch.ShortTensor

16位整型

torch.IntTensor

32位整型

torch.LongTensor

64位整型

二、Tensor的创建

(1)创建一个64位浮点型且指定矩阵值为[1,2],[3,4],[5,6]的矩阵:

import torch as t
a=t.DoubleTensor([[1,2],[3,4],[5,6]])
print(a)

在这里的  t.DoubleTensor()  可以换成其他类型,是一样的方法

运行结果:

tensor([[1., 2.],

        [3., 4.],

        [5., 6.]], dtype=torch.float64)

(2)创建一个仅指定形状未赋值的Tensor:

import torch as t
a=t.Tensor(3,2)
print(a)

运行结果:

tensor([[1.8524e+28, 7.5034e+28],

        [1.2695e+31, 1.7225e+22],

        [4.5925e+24, 1.7448e+22]])

提醒:系统不会马上给这个Tensor分配空间,使用时才会分配,分配空间大小取决于内存空间的状态

(3)依据另一个Tensor的形状创建Tensor

import torch as t
a=t.Tensor(3,2)
b=t.Tensor(a.size())
print("a={}\nb={}".format(a,b))

运行结果:

a=tensor([[1.2102e+25, 4.5437e+30],

        [4.5145e+27, 1.3556e-19],

        [1.3563e-19, 1.4587e-19]])

b=tensor([[7.2251e+28, 4.7987e+30],

        [1.5793e-19, 1.1703e-19],

        [1.3563e-19, 1.9517e-19]])

(4)还有一些常用的创建Tensor的方法:

方法

效果

torch.empty(size):

返回形状为size的空Tensor

torch.zeros(size):

返回形状为size、元素全部是0的Tensor

torch.zeros_like(input):

返回与input相同形状的、元素全部是0的Tensor

torch.ones(size)

返回形状为size、元素全部是1的Tensor

torch.ones_like(input)

返回与input相同形状的、元素全部是1的Tensor

torch.rand(size)

返回形状为size、元素为一组在[0,1)内满足均匀分布的随机数的Tensor

torch.randn(size)

返回形状为size、元素为一组满足标准正态分布(均值为0,方差为1)的随机数的Tensor

torch.eye(size)

返回形状为size、对角线元素全部是1的Tensor

torch.randperm(int)

返回形状为1*int,元素为0~int内不重复的整型Tensor

torch.arange(size)

返回一个元素为范围内随机数的Tensor,详见示例

示例:

import torch as t
a=t.empty(3,2)
b=t.zeros(2,3)
c=t.zeros(5,3,dtype=t.long)
d=t.zeros_like(c)
e=t.ones(2,3)
f=t.ones_like(e)
g=t.rand(3,2)
h=t.randn(2,3)
i=t.eye(3,3)
j=t.randperm(5)
k=t.arange(1,8,2)
print("a=={}\nb=={}\nc=={}\nd=={}\ne=={}\nf=={}\ng=={}\nh=={}\ni=={}\nj=={}\nk=={}\n".format(a,b,c,d,e,f,g,h,i,j,k))

运行结果:

a==tensor([[0., 0.],

        [0., 0.],

        [0., 0.]])

b==tensor([[0., 0., 0.],

        [0., 0., 0.]])

c==tensor([[0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0]])

d==tensor([[0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0],

        [0, 0, 0]])

e==tensor([[1., 1., 1.],

        [1., 1., 1.]])

f==tensor([[1., 1., 1.],

        [1., 1., 1.]])

g==tensor([[0.1040, 0.9542],

        [0.5337, 0.0391],

        [0.3123, 0.1004]])

h==tensor([[ 1.3699,  0.1626,  0.2756],

        [-1.6842, -1.8627,  0.4473]])

i==tensor([[1., 0., 0.],

        [0., 1., 0.],

        [0., 0., 1.]])

j==tensor([2, 4, 0, 1, 3])

k==tensor([1, 3, 5, 7])

三、Tensor的尺寸、数据类型、长度查看

size()函数或shape属性:查看Tensor尺寸

dtype属性:查看Tensor数据类型

numel()函数:查看Tensor元素个数

示例:

import torch as t
a=t.Tensor([[2,2],[1,4],[6,6]])
print("a==",a)
print("a.size()==",a.size())
print("a.shape==",a.shape)
print("a.dtype==",a.dtype)
print("a.numel==",a.numel())

运行结果:

a== tensor([[2., 2.],

        [1., 4.],

        [6., 6.]])

a.size()== torch.Size([3, 2])

a.shape== torch.Size([3, 2])

a.dtype== torch.float32

a.numel== 6

四、Tensor的形状调整

相关函数:

(1、torch.view(size)函数将其调整成形状为size的Tensor,元素数量在形状调整前后不变,即一个元素个数为8的Tensor,调整后也应为8,详见示例4.1。

(2、torch.resize_()函数是另一种用来调整Tensor形状的方法,但与torch.view()不同,它可以修改Tensor的尺寸。如果新尺寸超过原尺寸,则它会为Tensor自动分配新的内存空间,而如果新尺寸小于原尺寸,则原有的数据依旧会被保存,详见示例4.2。

示例4.1:

import torch as t
a=t.arange(0,8).view(2,4)
print(a)

运行结果:

tensor([[0, 1, 2, 3],

        [4, 5, 6, 7]])

小结:上述示例1可以理解为先创建一个二阶张量,长度为6,元素为0~8,然后用torch.view(size)函数将其调整成形状为2*4的Tensor

与分开书写等价:

import torch as t
a=t.arange(0,8).view(2,4)
b=t.arange(0,8)
c=b.view(2,4)
print(a)
print(c)

运行结果:

tensor([[0, 1, 2, 3],

        [4, 5, 6, 7]])

tensor([[0, 1, 2, 3],

        [4, 5, 6, 7]])

示例4.2

import torch as t
a=t.arange(0,4)
print("a==\n{}\n".format(a))
b=a.view(2,2)
print("b=a.view(2,2)==\n{}\n".format(b))
b.resize_(1,3)
print("a.view(2,2).resize_(1,3)==\n{}\n".format(b))
c=b.resize_(3,3)
print("a.view(2,2).resize_(1,3).resize_(3,3)==\n{}\n".format(c))

运行结果:

a==

tensor([0, 1, 2, 3])

b=a.view(2,2)==

tensor([[0, 1],

        [2, 3]])

a.view(2,2).resize_(1,3)==

tensor([[0, 1, 2]])

a.view(2,2).resize_(1,3).resize_(3,3)==

tensor([[            0,             1,             2],

        [            3,             0, 1381737846192],

        [          102,            93,             0]])

五、Tensor的加、减、乘、除、求幂、求绝对值

在深度学习里难免会有对Tensor进行加、减、乘、除、求幂、求绝对值等运算

示例5.1:

import torch as t
a=t.Tensor([[1,2],[3,4]])
b=t.Tensor([[5,6],[7,8]])
print("a加b==",t.add(a,b))
print("a减b==",t.sub(a,b))
print("a乘b==",t.mul(a,b))
print("a除b==",t.div(a,b))
print("a的2次幂==",t.pow(a,2))
print("b的绝对值==",t.abs(b))

运行结果:

a加b== tensor([[ 6.,  8.],

        [10., 12.]])

a减b== tensor([[-4., -4.],

        [-4., -4.]])

a乘b== tensor([[ 5., 12.],

        [21., 32.]])

a除b== tensor([[0.2000, 0.3333],

        [0.4286, 0.5000]])

a的2次幂== tensor([[ 1.,  4.],

        [ 9., 16.]])

b的绝对值== tensor([[5., 6.],

        [7., 8.]])

除了上面的简单运算,还有一些常用的Tensor的三角函数运算:

示例5.2

import torch as t
a=t.Tensor([-1.2027,2,0.4412,-1.3856])
tan=t.tan(a)
cos=t.cos(a)
sin=t.sin(a)
print("a的正切:",tan)
print("a的余弦:",cos)
print("a的正弦:",sin)

运行结果:

a的正切: tensor([-2.5929, -2.1850,  0.4722, -5.3378])

a的余弦: tensor([ 0.3598, -0.4161,  0.9042,  0.1841])

a的正弦: tensor([-0.9330,  0.9093,  0.4270, -0.9829])

六、Tensor间比较

1、touch.equal()函数

touch.equal(a,b,out=None)函数:若两个tensor(a和b)形状和元素相同则返回True,否则返回False

示例6.1:

import torch as t
a=t.Tensor([1,2])
b=t.Tensor([1,4])
print(t.equal(a,b))

运行结果:

False

2、touch.gt()、touch.ge()

touch.gt(input,other,out=None)函数:逐个元素比较,若input大于other,则返回True,否则返回False

touch.ge(input,other,out=None)函数:逐个元素比较,若input大于等于other,则返回True,否则返回False

示例6.2:

import torch as t
a=t.Tensor([[1,2],[3,4]])
b=t.Tensor([[1,3],[2,4]])
print("t.gt(a,b)=={}\nt.gt(a,2.5)=={}\nt.ge(a,b)=={}\n".format(t.gt(a,b),t.gt(a,2.5),t.ge(a,b)))

运行结果:

t.gt(a,b)==tensor([[False, False],

        [ True, False]])

t.gt(a,2.5)==tensor([[False, False],

        [ True,  True]])

t.ge(a,b)==tensor([[ True, False],

        [ True,  True]])

七、tensor元素的最大、最小、和、平均数

相关函数:

torch.max(tensor):返回tensor中最大的元素。

torch.min(tensor):返回tensor中最小的元素。

torch.sum(tensor):返回tensor中所有元素的和。

torch.mean(tensor):返回tensor中所有元素的平均数

示例:

import torch as t
tensor=t.arange(1,8,dtype=t.float)
print(tensor)
max=t.max(tensor)
min=t.min(tensor)
sum=t.sum(tensor)
mean=t.mean(tensor)
print("tensor的最大值是:{}\ntensor的最小值是:{}\ntensor的元素和是:{}\ntensor的元素均值是:{}\n".format(max,min,sum,mean))

运行结果:

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

tensor的最大值是:7.0

tensor的最小值是:1.0

tensor的元素和是:28.0

tensor的元素均值是:4.0

易错提醒:

代码中tensor=t.arange(1,8,dtype=t.float)要记得说明数据类型为float,不然touch.mean()函数会报错,错误如下:

RuntimeError: mean(): could not infer output dtype. Input dtype must be either a floating point or complex dtype. Got: Long

八、Tensor与NumPy数组间互相装换

1、Tensor转NumPy

import torch as t
tensor=t.arange(1,8)
numpy=tensor.numpy()
print("转换前:{}\n装换后:{}{}\n".format(tensor,numpy,type(numpy)))

运行结果:

转换前:tensor([1, 2, 3, 4, 5, 6, 7])

装换后:[1 2 3 4 5 6 7]<class 'numpy.ndarray'>

2、NumPy转Tensor

import torch as t
import numpy as np
numpy=np.arange(1,8)
tensor=t.from_numpy(numpy)
print("转换前:{}\n装换后:{}{}\n".format(numpy,tensor,type(tensor)))

运行结果:

转换前:[1 2 3 4 5 6 7]

装换后:tensor([1, 2, 3, 4, 5, 6, 7], dtype=torch.int32)<class 'torch.Tensor'>

3、tensor与numpy数组互转方法总结

Tensor转NumPy:tensor.numpy()

NumPy转Tensor:tensor.from_numpy(numpy)

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好呀zws

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值