在 3D 矩阵上广播 linalg.pinv

broadcasting linalg.pinv on a 3D matrix

在下面的示例中,有一个大小为 (4, 3, 3) 的 3d 矩阵。如何在没有 numpy 循环的情况下计算 3*3 矩阵中的 4 个中的每一个的 pinv?

dt = np.dtype(np.float32)

a=[[[12,3,1],
   [2,4,1],
   [2,4,2],],
   [[12,3,3],
   [2,4,4],
   [2,4,5],],
   [[12,3,6],
   [2,4,5],
   [2,4,4],],
   [[12,3,3],
   [2,4,5],
   [2,4,6]]]

a=np.asarray(a,dtype=dt)
print(a.shape)

apinv=np.zeros((4,3,3))
print(np.linalg.pinv(a[0,:,:]).shape)

for i in range(4):
   apinv[i,:,:]=np.linalg.pinv(a[i,:,:])

请注意 linalg.inv 通过矩阵进行广播,正如所描述的那样 here:

print(np.linalg.inv(a).shape)

但它对 pinv 的工作方式不同。

一种解决方案是使用 map 和 lambda 函数:

apinv = map(lambda n: np.linalg.pinv(n), a)
apinv = np.asarray(apinv,dtype=dt)