1.课前准备
- 安装Anaconda(自带Jupyter notebook)与python,并安装numpy(安装了Anaconda后无需担心,用CPU运行,CPU版本的matelable)与pytorch(GPU版本的numpy 既能CPU又能GPU)
- 安装编辑器Pycharm
2.张量的基础概念
张量阶数 | 例子 | |
---|---|---|
标量(没有分量) | 0 | 能量、温度、一门课的总成绩 |
向量 | 1 | 速度、力、多门课的总成绩构成的数列 |
矩阵 | 2 | 算符的系数矩阵、黑白图片 |
张量 | N | 彩色图片(三阶张量) |
- N维张量又称N维数列
- 张量阶数即为张量指标的个数
- 向量、矩阵也被称为1阶张量、2阶张量
- 每个指标可取的值的个数,被称为指标的维数
- 张量的“直观”定义:多个指标标记下的一堆数
2.1 代码实例
向量:
v = np.random.randn(4,) #生成长度为4的随机向量 randn为高斯分布
print(v)
print(v.shape) #v的形状
print(v.size) #v中包含的元素的个数
print(v.dot(v)) #v和v的内积 v.T表示v的转置
v[1] = 10.21 #修改v的某个元素
矩阵:
m = np.random.randn(2,2) + np.random.randn(2,2) * 1j # 生成2*2的随机复矩阵
print(m.conj()) # 求矩阵共轭
print(m.conj().T) # 求矩阵共轭转置
print(np.eye(2)) #打印单位阵
print(np.zeros((2,4))) #打印全零矩阵
张量:
x = np.random.randn(2,2,2) #随机生成一个2*2*2的三阶张量
print(x.ndim) #张量的阶数
print(np.ones((2,3,2))) #生成全1的三阶张量
3.张量的图形表示
——张量用连接着N个腿(bond)的圆圈或方块表示,N为张量的阶数
注:一个腿表示一个指标
4.张量的基本操作
- 切片——提取相关元素
- transpose命令——改变张量指标的顺序
- reshape命令——张量的阶数可以进行相互的转换(改变张量的形状)
注:使用transpose命令和reshape命令转换张量前后,其所包含的元素总个数不变,意义仅在于采用不同的index标记各个元素(改变的只是表示方式,值没有改变)
4.1 代码实例
向量切片:
v = np.arange(6) #输出[0 1 2 3 4 5 ]
print(v[:3]) #输出[0 1 2]
张量切片:
x = np.random.randn(4,4,4)
y = x[:3,1:3,1:]
print(y.shape) #输出为(3,2,3)
代码贴图:
x
y
向量的reshape:
V = np.arange(0,6,1) # 产生一个随机的向量,从0到5,步长为1
print(v.reshape(2,3))# 将向量变为2*3的矩阵
注:改变其指标标记的方式,不改变本身。如:在向量V中4的指标为 4 ,在矩阵中为(1,1)
矩阵的transpose:
m = np.array([[11,12,13],[21,22,23]])
print(m.transpose(1,0))# 把第一个指标放在第零个位置,把第零个指标放在第一个位置(转置)
5.张量的基本运算
向量内积
C
=
∑
a
x
a
y
a
C = \sum\limits_a x_ay_a
C=a∑xaya
对
a
a
a求和
向量乘矩阵
v
b
=
∑
a
x
a
M
a
b
=
x
M
v_b = \sum\limits_a x_aM_{ab} =xM
vb=a∑xaMab=xM
对
a
a
a求和
矩阵乘矩阵
M
a
c
=
∑
b
A
a
b
B
b
c
=
A
B
M_{ac} = \sum\limits_b A_{ab}B_{bc} = AB
Mac=b∑AabBbc=AB
对
b
b
b求和
张量缩并
T
a
c
d
e
=
∑
b
A
a
b
c
B
b
d
e
T_{acde} = \sum\limits_b A_{abc}B_{bde}
Tacde=b∑AabcBbde
对
b
b
b求和
5.1 代码实例
向量内积,外积,克罗内克积:
np.random.seed(0) #固定随机数种子,每次随机都能随出同一种数
dim = 3
x = np.random.randn(dim,) #三维随机向量
y = np.random.randn(dim,) #三维随机向量
print(np.inner(x,y)) #向量内积
print(np.dot(x,y)) #向量内积
print(x.dot(y)) #向量内积
print(np.outer(x,y))#向量外积
print(np.kron(x,y))#克罗内克积 两个三维向量生成一个九维向量
注:克罗内克积与向量外积只差一个reshape()
向量乘矩阵,矩阵乘矩阵:
dim = 3
m = np.random.randn(dim,dim) #随机生成一个3*3的矩阵
x = np.random.randn(dim,) #三维随机向量
print(m.dot(x))#矩阵与向量
print(m.dot(m))#矩阵与矩阵
print(m.trace())#求矩阵迹
张量缩并:
tensordot方法
A = np.random.randn(5,3,2)#生成一个5*3*2的张量
B = np.random.randn(3,6,4)#生成一个3*6*4的张量
#希望将A的第二个指标和B的第一个指标进行收缩
C1 = np.tensordot(A,B,[[1],[0]]) #收缩结果为(5,2,6,4)
einsum方法
A = np.random.randn(5,3,3)#生成一个5*3*3的张量
B = np.random.randn(6,3,3)#生成一个6*3*3的张量
C = np.random.randn(4,3,3)#生成一个4*3*3的张量
T = np.einsum('iab,jbc,kca->ijk',A,B,C) #iab,jbc,kca->ijk是求和公式 ijk为收缩结果指标
演示图: