einsum的计算是由输出的字符串决定的,下面举例:
1. 矩阵乘法:
import numpy as np
A = np.random.rand(2, 3)
B = np.random.rand(3, 4)
C = np.einsum('ij,jk->ik', A, B)
在这个例子中,'ij,jk->ik'
表示 A 的第一个维度 i
与 B 的第二个维度 k
保持不变,而 j
是要被求和的维度。因此,这个操作实际上是矩阵乘法。
转置:
A = np.random.rand(2, 3)
B = np.einsum('ij->ji', A)
A = np.random.rand(2, 3) B = np.einsum('ij->ji', A)
这里 'ij->ji'
表示将矩阵 A 的第一个维度 i
和第二个维度 j
交换,从而实现矩阵转置。
内积:
A = np.random.rand(3)
B = np.random.rand(3)
dot_product = np.einsum('i,i->', A, B)
A = np.random.rand(3) B = np.random.rand(3) dot_product = np.einsum('i,i->', A, B)
这里 'i,i->'
表示将两个一维向量的对应元素相乘并求和,即内积。
外积:
A = np.random.rand(3)
B = np.random.rand(4)
outer_product = np.einsum('i,j->ij', A, B)
A = np.random.rand(3) B = np.random.rand(4) outer_product = np.einsum('i,j->ij', A, B)
这里 'i,j->ij'
表示计算两个向量的外积,生成一个 3x4 的矩阵。
迹(trace):
A = np.random.rand(3, 3)
trace = np.einsum('ii->', A)
A = np.random.rand(3, 3) trace = np.einsum('ii->', A)
这里 'ii->'
表示计算矩阵 A 的对角元素之和,即迹。
通过 einsum
,你可以简洁而高效地表达复杂的张量运算,这在科学计算和机器学习中尤为有用。