# -*- coding:utf-8 -*-
import torch
import numpy as np
#根据torch.tensor生成张量
print(torch.tensor(1))
print(torch.tensor((2,3)))
print(torch.tensor([2,3]))
#根据torch.Tensor生成张量
print(torch.Tensor(3))
print(torch.Tensor(3,4))
print(torch.Tensor((3,4)))
print(torch.Tensor([3,4]))
#张量和NumPy数组的相互转化
#将Numpy数组转化为张量
F=np.ones((3,4))
print(F)
print(torch.as_tensor(F))
print(torch.from_numpy(F))
#将张量转化为数组 .numpy()
print(torch.as_tensor(F).numpy())
torch.manual_seed(100)
A=torch.normal(mean=0.0,std=torch.tensor(1.0))
print(A)
C=torch.ones(2,3)
print(C)
D=torch.rand_like(C) #rand_like生成尺寸一样的张量
print(D)
E=torch.randn(3,3)
print(E)
F=torch.randn_like(E)
print(F)
G=torch.randperm(10) #生成随机生成的从0到9的一维的张量
print(G)
H=torch.arange(start=0,end=10,step=2)
print(H)
J=torch.linspace(start=1,end=10,steps=5) #生成从1到10等间距的5个数,包括1和10
print(J)
#torch.zeros(3,3)
#torch.ones(3,3)
#torch.eye(3,3)
#torch.full((3,3),fill_value=0.25)
#torch.empty(3.3)
#print(torch.empty(3.3)) #生成一个空张量看,没有赋值
##############################
#张量操作
##############################
#1 改变张量的形状
A=torch.arange(12.0)
print(A)
print(A.reshape(3,4))
print(A.reshape(-1,3))
print(A.resize_(2,6))
print(A)
print("*"*90)
#2 增加维度和减少维度
A=torch.arange(12).reshape(2,6)
print(A.size())
B=torch.unsqueeze(A,dim=0) #在第一维上面加上一个维度
print(B.size())
C=B.unsqueeze(dim=3)
print(C.size())
D=C.squeeze(dim=3) #squeeze只能去除维度为1的地方
print(D.size())
E=torch.squeeze(C,dim=3)
print(E.size())
print("#"*90)
A=torch.arange(10)
B=A.expand(2,-1)
print(A)
print(A.size())
print(B)
print(B.size())
print("@"*100)
A=torch.arange(12).reshape(1,3,4)
print(A)
print(A[0].size())
print(A[:,:2,:])
print(A[:,:2,:].size())
##############################
#张量拼接和拆分
##############################
print("*"*100)
A=torch.arange(8).reshape(2,4,1)
print(A)
B=torch.linspace(0,10,8).reshape(2,4,1)
print(B)
#在0维度上拼接张量 在第0个维度上拼接
C=torch.cat((A,B),dim=0)
print(C.size())
#在1维度上拼接张量,在第1维度上拼接
C=torch.cat((A,B),dim=1)
print(C.size())
#coding:utf-8
import torch
#张量的基本运算
#元素的计算
A=torch.arange(6.0).reshape(2,3)
B=torch.linspace(10.0,20.0,steps=6).reshape(2,3)
print("A=",A)
print("B=",B)
print("A*B=",torch.mul(A,B))
print("A*B=",A*B)
print(torch.eq(torch.mul(A,B),A*B))
print("A/B=",A/B)
#矩阵的转置
C=torch.t(A)
print("C= ",C)
print("*"*100)
#矩阵相乘 torch.matmul针对高维度后面两个进行矩阵乘法,torch.mm只针对两个维度
A=torch.arange(6.0).reshape(2,3)
B=torch.linspace(10.0,20.0,steps=6).reshape(3,2)
print(torch.matmul(A,B).size())
print(torch.mm(A,B).size())
#函数作用
#计算两个tensor的矩阵乘法,torch.bmm(a,b),tensor a 的size为(b,h,w),tensor b的size为(b,w,h),注意两个tensor的维度必须为3.