簡體   English   中英

Numpy:向量矩陣,求逆

[英]Numpy : matrix of vectors, inversion

我有一個維度為 N x N 的矩陣 A,每個矩陣元素都是一個大小為 M 的向量。我想對 A 矩陣求逆。 換句話說,我想計算 A^-1,它是由大小為 M 的 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')

我需要矩陣運算和元素運算的混合。 但我不喜歡我的實現。 我是一個非常簡單的實現,存在的代碼更少。 讓我知道你的建議。

在將最后一個軸推到前面后,我們可以在 3D 陣列a上使用np.linalg.inv 然后,我們可以將einsum用於最終的 output 以采用矢量化方式 -

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

獲得最終 output 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)

如果您沿第一個維度而不是最后一個維度堆疊矩陣,則可以在一個np.linalg.pinv()調用中將它們全部反轉。 然后使用np.einsum()在一個 go 中做所有點積:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM