这里是实现我想做的代码,我只是计算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')
我需要混合使用矩阵运算和按元素运算。但是我不喜欢我的实现。我是一个非常简单的实现,只存在较少的代码。让我知道您的建议。
答案 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)