我有几个我想要乘法的numpy数组(使用dot
,所以矩阵乘法)。我想将它们全部放入一个numpy阵列,但我无法弄清楚如何做到这一点。
E.g。
a = np.random.randn((10,2,2))
b = np.random.randn((10,2))
所以我有10个2x2矩阵(a)和10个2x1矩阵(b)。我能做的是:
c = np.zeros((10,2))
for i in range(10):
c[i] = np.dot(a[i,:,:],b[i,:])
你明白了。
但我觉得有dot
或tensordot
的用法,或者很容易在一行中完成此操作。我无法理解> 2维度的dot
和tensordot
函数。
答案 0 :(得分:3)
您可以使用np.einsum
:
c = np.einsum('ijk,ik->ij', a, b)
einsum
执行一系列产品。由于矩阵乘法是乘积之和,因此可以使用einsum
表示任何矩阵乘法。它基于Einstein summation notation。
einsum的第一个参数,ijk,ik->ij
是subscripts
的字符串。
ijk
声明a
有三个轴,由i
,j
和k
表示。
ik
声明b
的轴将被标记为i
和k
。
当下标重复时,这些轴被锁定在一起以便求和。
->
后面的下标部分显示了求和后将保留的轴。
由于k出现在左侧(->
)但在右侧消失,因此总和超过k
。这意味着总和
c_ij = sum over k ( a_ijk * b_ik )
应该计算。由于可以为每个i
和j
计算此总和,因此结果是一个包含下标i
和j
的数组。