numpy.einsum
函数是一个强大的工具,用于执行爱因斯坦求和约定(Einstein summation convention),它允许你以一种非常灵活的方式执行各种类型的张量操作,包括矩阵乘法。对于你的问题,我们想要对一个3D数组执行矩阵乘法以获得一个2D的乘积矩阵。
numpy.einsum
提供了高度的灵活性,允许你精确地指定你想要执行的操作。einsum
通常更简洁,更容易理解。numpy.einsum
可以执行多种类型的张量操作,包括矩阵乘法、点积、外积等。假设我们有一个形状为(n, m, p)
的3D数组A
,和一个形状为(p, q)
的2D数组B
。我们想要得到一个形状为(n, m, q)
的3D数组C
,其中C[i,j,k] = sum(A[i,j,l] * B[l,k])
对于所有的i, j, k
。
import numpy as np
# 创建示例数组
A = np.random.rand(2, 3, 4) # 形状为 (n, m, p)
B = np.random.rand(4, 5) # 形状为 (p, q)
# 使用 einsum 执行矩阵乘法
C = np.einsum('ijl,lk->ijk', A, B)
print(C.shape) # 输出 (2, 3, 5)
在这个例子中,'ijl,lk->ijk'
是einsum
的公式字符串,它精确地描述了我们要执行的操作:
'ijl'
表示A
数组的索引,其中i
是第一个维度,j
是第二个维度,l
是第三个维度(与B
的第一个维度相匹配)。'lk'
表示B
数组的索引。'ijk'
表示输出数组C
的索引。einsum
可能会比其他专门的矩阵乘法函数(如numpy.matmul
或@
运算符)慢。在这种情况下,可以考虑使用这些更高效的函数。领取专属 10元无门槛券
手把手带您无忧上云