Matrix 快速反转或点kxnxn矩阵的方法
是否有一种使用numpy快速计算kxnxn矩阵的逆的方法(在每个k切片上计算逆)?换句话说,有没有一种方法可以将以下代码矢量化: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,:,:])
>>>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
应该可以做到这一点,但我不能完全控制住它。。。