Numpy矩阵乘法与矩阵数组

时间:2014-12-09 19:50:01

标签: python numpy

我有几个我想要乘法的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,:])

你明白了。

但我觉得有dottensordot的用法,或者很容易在一行中完成此操作。我无法理解> 2维度的dottensordot函数。

1 个答案:

答案 0 :(得分:3)

您可以使用np.einsum

c = np.einsum('ijk,ik->ij', a, b)

einsum执行一系列产品。由于矩阵乘法是乘积之和,因此可以使用einsum表示任何矩阵乘法。它基于Einstein summation notation

einsum的第一个参数,ijk,ik->ijsubscripts的字符串。 ijk声明a有三个轴,由ijk表示。

类似地,

ik声明b的轴将被标记为ik

当下标重复时,这些轴被锁定在一起以便求和。 ->后面的下标部分显示了求和后将保留的轴。

由于k出现在左侧(->)但在右侧消失,因此总和超过k。这意味着总和

c_ij = sum over k ( a_ijk * b_ik )
应该计算

。由于可以为每个ij计算此总和,因此结果是一个包含下标ij的数组。

相关问题