Matrix 快速反转或点kxnxn矩阵的方法

Matrix 快速反转或点kxnxn矩阵的方法,matrix,numpy,scipy,Matrix,Numpy,Scipy,是否有一种使用numpy快速计算kxnxn矩阵的逆的方法(在每个k切片上计算逆)?换句话说,有没有一种方法可以将以下代码矢量化: >>>from numpy.linalg import inv >>>a-random(4*2*2).reshape(4,2,2) >>>b=a.copy() >>>for k in range(len(a)): >>> b[k,:,:] = inv(a[k,:,:])

是否有一种使用numpy快速计算kxnxn矩阵的逆的方法(在每个k切片上计算逆)?换句话说,有没有一种方法可以将以下代码矢量化:

>>>from numpy.linalg import inv
>>>a-random(4*2*2).reshape(4,2,2)
>>>b=a.copy()
>>>for k in range(len(a)):
>>>    b[k,:,:] = inv(a[k,:,:])

首先是求逆。我已经研究了
np.linalg.tensorinv
np.linalg.tensorsolve

我认为不幸的是,tensorinv不能满足你的需求。它需要阵列为“方形”。这排除了您想要做的事情,因为他们对正方形的定义是
np.prod(a[:i])==np.prod(a[i:])
,其中
i
是0、1或2(通常是数组的一个轴);这可以作为
tensorinv
的第三个参数
ind
。这意味着,如果你有一个长度为M的NxN矩阵的一般数组,你需要有例如(对于i=1)NxN==NxM,这在一般情况下是不正确的(在你的例子中它实际上是正确的,但它并没有给出正确的答案)

现在,也许使用
tensorsolve
可以实现一些功能。然而,在将
a
矩阵数组作为第一个参数传递给
tensorsolve
之前,需要对其进行一些繁重的构造工作。因为我们希望
b
是“矩阵数组方程”的解
a*b=1
(其中
1
是一个单位矩阵数组),
1
的形状与
a
b
相同,我们不能简单地将上面定义的
a
作为
tensorsolve
的第一个参数。相反,它需要是形状为(M,N,N,M,N,N)或(M,N,N,N,M,N)或(M,N,N,N,M)的数组。这是必要的,因为
tensorsolve
将与
b
在最后三个轴上相乘,并对其求和,因此结果(函数的第二个参数)也是形状(M,N,N)

其次,关于点产品(你的标题表明这也是你问题的一部分)。这是非常可行的。两种选择

第一:提出一些好的建议

第二:为了清晰起见,我个人喜欢使用
np.einsum
。例如:

a=np.random.random((7,2,2))
b=np.random.random((7,2,2))
np.einsum('ijk,ikl->ijl', a,b)
这将使数组
a
b
中的所有7个“矩阵”相乘。它似乎比上面博客文章中的数组方法慢2倍左右,但仍然比使用for循环快70倍左右,如您的示例所示。事实上,对于较大的阵列(例如10000个5x5矩阵),
einsum
方法似乎稍快一些(不确定原因)


希望这能有所帮助。

我觉得
numpy.linalg.tensorinv
应该可以做到这一点,但我不能完全控制住它。。。