import torch
import pandas as pd
import numpy as np
#标量表示和运算
x=torch.tensor([3.0])
y=torch.tensor([2.0])
x+y,x*y,x/y,x**y
#可以将向量视为标量值组成的列表
x=torch.arange(4,dtype=torch.float32)
print(x)
#通过张量的索引来访问任一元素
print(x[3])
#访问张量的长度
print(len(x))
#只有一个轴的张量,形状只有一个元素
print(x.shape)
#通过指定两个分量m和n来创建一个形状为m*n的矩阵
a=torch.arange(20,dtype=torch.float32).reshape(5,4)
#矩阵的转置
b=a.T
#对称矩阵 A=A的转置
b=torch.tensor([[1,2,3],[2,0,4],[3,4,5]])
print(b==b.T)
#就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构
x=torch.arange(24,dtype=torch.float32).reshape(2,3,4)
print(x)
#给定具有相同形状的任何两个张量,任何按元素二元运算的结果都将是相同形状的张量
a=torch.arange(20,dtype=torch.float32).reshape(5,4)
b=a.clone() #用copy会类型冲突,复制张量类需要用clone()
a,a+b
#两个矩阵的按元素乘法 称为 哈达玛积
a*b
a=2
x=torch.arange(24).reshape(2,3,4)
print(a+x)
print((a*x).shape)
#计算其元素和
x=torch.arange(4,dtype=torch.float32)
print(x.sum())
#表示任意形状张量的元素和
a=torch.arange(20*2,dtype=torch.float32).reshape(2,5,4)
print(a.shape)
print(a.sum())
#指定求和汇总张量的轴
sum_a0=a.sum(axis=0)
print(sum_a0)
print(sum_a0.shape)
sum_a1=a.sum(axis=1)
print(sum_a1)
print(sum_a1.shape)
print(a.sum(axis=[0,1]))
#一个与求和相关的量 平均值
a.mean(),a.sum()/a.numel() #注意直接用mean()需要类型是浮点
a.mean(axis=0),a.sum(axis=0)/a.shape[0]
#计算总和或均值是保持轴数不变 ,使用广播机制
sum_a=a.sum(axit=1,keepdim=True)
#通过广播机制将 a除以sum_a
b=a/sum_a
#点积是相同位置的按元素乘积的和
y=torch.ones(4,dtype=torch.float32)
x,y,torch.dot(x,y) #注意dot只能用于一行元素的点积
#我们可以通过执行按元素乘法,然后进行求和来表示两个向量的点积
torch.sum(x*y)
#矩阵向量积AX是一个长度为m的列向量
b=torch.mv(a,x) #是一个矩阵与向量的积,结果的行数等于矩阵行数
#矩阵乘法
b=torch.ones(4,3)
torch.mm(a,b)
#l2范数是向量元素平方和的平方根
u=torch.tensor([3.0,-4.0])
torch.norm(u)
#l1范数 表示向量元素的绝对值之和
torch.abs(u).sum()
#矩阵的 弗洛贝尼乌斯范数 是矩阵元素的平方和的平方根
torch.norm(torch.ones(4,9))