import torch
import numpy
#1.张量表示一个数值组成的数组,这个数组可能有多个维度
x=torch.arange(12)
print(x)
#tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
#2.张量的属性shape来访问张量的形状和张量中元素的总数
print(x.shape)
#torch.Size([12])
print(x.numel())
#12
#3.要改变一个张量的形状而不改变元素数量和元素值,我们可以调用reshape函数。
X =x .reshape(3,4)
print(X)
"""tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""
#4.使用全0、全1、其他常量或者从特定分布中随机采样的数字
print(torch.zeros((2,3,4)))#高,行,列
"""tensor([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
print(torch.ones(2,3))
tensor([[1., 1., 1.],
[1., 1., 1.]])"""
#5.通过提供包含数值的Python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值
print(torch.tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]]).shape)
#torch.Size([1, 3, 4])
#6.常见的标准算术运算符(+、-、*、/和**)卢都守以被升级为按元素运算
x=torch.tensor([1,2,3,4])
y=torch.tensor(([2.0,4,5,6]))
print(x+y)#tensor([ 3., 6., 8., 10.])
print(x-y)#tensor([-1., -2., -2., -2.])
print(x*y)#tensor([ 2., 8., 15., 24.])
print(x/y)#tensor([0.5000, 0.5000, 0.6000, 0.6667])
print(x**y)#tensor([1.0000e+00, 1.6000e+01, 2.4300e+02, 4.0960e+03])
z=torch.tensor([1.0,2,3,4])
print(torch.exp(z))#e的多少次方
#tensor([ 2.7183, 7.3891, 20.0855, 54.5981])
#7.把多个张量连接在一起
x=torch.arange(12,dtype=torch.float32).reshape((3,4))
y=torch.tensor([[ 0, 5, 2, 3],
[ 4, 5, 8, 7],
[ 2, 4, 10, 1]])
print(torch.cat((x,y),dim=0))
"""tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 0., 5., 2., 3.],
[ 4., 5., 8., 7.],
[ 2., 4., 10., 1.]])"""
print(torch.cat((x,y),dim=1))
"""tensor([[ 0., 1., 2., 3., 0., 5., 2., 3.],
[ 4., 5., 6., 7., 4., 5., 8., 7.],
[ 8., 9., 10., 11., 2., 4., 10., 1.]])"""
#8.通过逻辑运算符构建二元张量
x=torch.tensor([1,2,3,4])
y=torch.tensor(([2.0,4,5,6]))
print(x==y)
#tensor([False, False, False, False])
#9.张量操作
y=torch.tensor([[ 0, 5, 2, 3],
[ 4, 5, 8, 7],
[ 2, 4, 10, 1]])
print(y[-1])#取最后一行
print(y[1:2])#取第1行
y[1,2]=100#第1行第2列的元素赋值
print(y)
"""tensor([ 2, 4, 10, 1])
tensor([[4, 5, 8, 7]])
tensor([[ 0, 5, 2, 3],
[ 4, 5, 100, 7],
[ 2, 4, 10, 1]])"""
#10.内存问题
y=torch.tensor([ 2, 4, 10, 1])
x=torch.arange(4)
before=id(y)
y+=x
print(id(y)==before)
#True
y=y+x
print(id(y)==before)
#False
z=torch.zeros_like(y)
print(id(z))
#2378792739072
z[:]=x+y
print(id(z))
#2378792739072
#11.转换为numpy张量,转变为常量
A=x.numpy()
B=torch.tensor(A)
print(type(A),type(B))
#<class 'numpy.ndarray'> <class 'torch.Tensor'>
c=torch.tensor([3.5])
print(c,c.item(),float(c),int(c))
#tensor([3.5000]) 3.5 3.5 3
x=torch.tensor([2,3,4,5])
print(x.sum())#tensor(14)
y=torch.arange(12).reshape((3,4))
print(y.sum())#tensor(66)