首先是关于求逆。我已经研究过np.linalg.tensorinv
and np.linalg.tensorsolve
.
我认为不幸的是tensorinv
不会给你你想要的。它需要数组是“方形”的。这排除了你想要做的事情,因为他们对正方形的定义是np.prod(a[:i]) == np.prod(a[i:])
where i
是 0、1 或 2(通常是数组的轴之一);这可以作为第三个参数给出ind
of tensorinv
。这意味着,如果您有一个长度为 M 的 NxN 矩阵的通用数组,则需要例如(对于 i = 1)NxN == NxM,这通常是不正确的(在您的示例中实际上是正确的,但它无论如何都没有给出正确的答案)。
现在,也许有些事情是可能的tensorsolve
。然而,这将涉及一些繁重的施工工作a
矩阵数组之前作为第一个参数传递给tensorsolve
。因为我们想要b
是“矩阵阵列方程”的解a*b = 1
(where 1
是单位矩阵的数组)和1
将具有相同的形状a
and b
,我们不能简单地提供a
您将上面定义为第一个参数tensorsolve
。相反,它需要是形状为 (M,N,N,M,N,N) 或 (M,N,N,N,M,N) 或 (M,N,N,N,N,M) 的数组)。这是必要的,因为tensorsolve
将乘以b
在最后三个轴上并对它们求和,以便结果(函数的第二个参数)再次具有形状(M,N,N)。
其次,关于点积(您的标题表明这也是您问题的一部分)。这是非常可行的。两个选择。
First: 詹姆斯·亨斯曼 (James Hensman) 的这篇博文 http://jameshensman.wordpress.com/2010/06/14/multiple-matrix-multiplication-in-numpy/给出了一些好的建议。
第二:我个人喜欢用np.einsum
为了清晰起见更好。例如。:
a=np.random.random((7,2,2))
b=np.random.random((7,2,2))
np.einsum('ijk,ikl->ijl', a,b)
这将对数组中的所有 7 个“矩阵”进行矩阵乘法a
and b
。它似乎比上面博客文章中的数组方法慢大约 2 倍,但它仍然比您的示例中使用 for 循环快大约 70 倍。事实上,对于更大的数组(例如 10000 个 5x5 矩阵)einsum
方法似乎稍微快一些(不知道为什么)。
希望有帮助。