numpy:向量矩阵,反演

时间:2019-11-20 14:05:27

标签: python numpy matrix

我有一个维度为N x N的矩阵A,每个矩阵元素都是大小为M的向量。 我想逆矩阵。换句话说,我想计算A ^ -1,这是由大小为N的NxN个矢量组成的反向A矩阵。

这里是实现我想做的代码,我只是计算M倍的逆矩阵来计算C = A ^ -1 x B,然后检查A x C =B。但是每次对A,B元素的M元素进行迭代以进行矩阵求逆。我很确定我的代码可以满足我的需要,但不会巧妙地...

a = np.array([[[3, 4, 8], [1,8,3]],
     [[2, 1, 2], [6, 5, 0]]])

b = np.array([[2, 0, 6],
     [5, 2, 5]])

c = []
# compute c = a^-1 x b
for i in range(a.shape[-1]):
    c.append(np.linalg.inv(a[:,:,i])@b[:,i])
c = np.asarray(c)

# check inversion compute a x c and checks a x c = b 
for i in range(a.shape[-1]):
    if not np.allclose(a[:,:,i]@c[i,:], b[:,i]):
        raise Exception('Inversion ko')
        break
print('inversion ok')

我需要混合使用矩阵运算和按元素运算。但是我不喜欢我的实现。我是一个非常简单的实现,只存在较少的代码。让我知道您的建议。

2 个答案:

答案 0 :(得分:1)

在将最后一个轴推到前面之后,我们可以在3D阵列np.linalg.inv上使用a。然后,我们可以以向量化的方式利用einsum获得最终输出-

p = np.linalg.inv(a.transpose(2,0,1))
c = np.einsum('ijk,kli->ij',p,b)[...,None]

使用c-获得最终输出np.matmul/@-operator的更简单选择-

c = p@b.transpose(2,0,1)

因此,整个过程可以转换为单线-

c = np.linalg.inv(a.transpose(2,0,1))@b.transpose(2,0,1)

答案 1 :(得分:0)

如果沿第一个维度(而不是最后一个维度)堆叠矩阵,则可以在单个np.linalg.pinv()调用中将它们全部倒置。然后使用np.einsum()一次性完成所有点积:

a = a.transpose(2, 0, 1)
b = b.transpose()

np.einsum('fmn,fm->fn', np.linalg.inv(a), b)